类和对象
OOP第二课
- 1 类的构成
- 1.1 从结构到类
- 1.2 类的构成
- 2 成员函数的声明
- 2.1 普通成员函数形式
- 2.2 将成员函数以内联函数的形式进行说明
- 3 对象的定义和使用
- 3.1 对象的定义
- 3.2 对象中成员的访问
- 3.3 类成员的访问属性
- 3.4 类中成员的访问方式
- 3.5 对象赋值语句
- 3.6 类的作用域
类(class)是面向对象程序设计的最基本的概念,是C++最强有力的特征,是进行封装和数据隐藏的工具,它将一个数据结构与一个操作集紧密地结合起来。类对象是类的实例,用类对象模拟现实世界中的事物比用数据对象更确切。
1. 类的构成
1.1 从结构到类
结构是C的一种自定义的数据类型,它把相关联的数据元素组成一个单独的统一体。
例2.1有关日期结构的例子
#include <iostream.h>
struct Date {
int year;
int month;
int day;
};
int main()
{
Date date1;
date1.year=2003;
date1.month=8;
date1.day=25;
cout<<date1.year<<"."<<date1.month<<"."
<<date1.day<<endl;
return 0;
}
?class与struct的比较
- 类是C++对C中结构的扩展。
- C语言中的struct是数据成员集合,而C++中的类,则是数据成员和成员函数的集合。
- struct是用户定义的数据类型,是一种构造数据类型。类和struct一样,也是一种用户定义的数据类型,是一种构造数据类型。
- C结构无法对数据进行保护和权限控制,所以结构中的数据是不安全的。C++中的类将数据和与之相关联的数据封装在一起,形成一个整体,具有良好的外部接口可以防止数据未经授权的访问,提供了模块间的独立性。
1.2 类的构成
类的成员分两部分:一部分对应数据的状态,称为数据成员,另一部分为作用于该数据状态的函数,称为成员函数。
类声明的一般格式如下:
class 类名 {
public:
公有数据成员;
公有成员函数;
protected:
保护数据成员;
保护成员函数;
private:
私有数据成员;
私有成员函数;
};
3个关键字: private
、protected
和public
,称为访问权限关键字。每个关键字下面又都可以有数据成员和成员函数。
private
部分称为类的私有部分,这一部分的数据成员和成员函数称为类的私有成员。私有成员只能由本类的成员函数访问,而类外部的任何访问都是非法的。public
部分称为类的公有部分,这部分的数据成员和成员函数称为类的公有成员。公有成员可以由程序中的函数访问,它对外是完全开放的。protected
部分称为类的保护部分,这部分的数据成员和成员函数称为类的保护成员。保护成员可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问,而类外的任何访问都是非法的。
注意:
- (1) 类声明格式中的3个部分并非一定要全有,但至少要有其中的一个部分。
- 一般一个类的数据成员应该声明为私有成员,成员函数声明为公有成员。
- (2) 类声明中的
private
、protected
和public
三个关键字可以按任意顺序出现任意次。但是,如果把所有的私有成员、保护成员和公有成员归类放在一起,程序将更加清晰。 - (3)
private
处于类体中第一部分时, 关键字private
可以省略。 - (4) 数据成员可以是任何数据类型,但不能用自动(auto)、寄存器(register)或外部(extern)进行声明。
- (5) 不能在类声明中给数据成员赋值。C++规定,只有在类对象定义之后才能给数据成员赋初值
用一个类来描述日期,其形式如下:
class Date {
public:
void setDate(int y,int m,int d);
void showDate();
private:
int m_year;
int m_month;
int m_day;
};
2. 成员函数的声明
成员函数的声明通常采用以下两种方式:
2.1 普通成员函数形式
即在类的声明中只给出成员函数的原型,而成员函数体写在类的外部。
返回类型 成员函数 (参数列表);
类外定义的一般形式是:
返回类型 类名∷成员函数名(参数表)
{
// 函数体
}
例如, 以下是表示坐标点的类Coord的声明
class Coord {
public:
void setCoord (int,int); // 设置坐标点
int getx(); // 取x坐标点
int gety(); // 取y坐标点
private:
int x,y;
};
void Coord∷setCoord(int a,int b){ x=a; y=b;}
int Coord::getx(){ return x;}
int Coord::gety(){ return y;}
内联函数和外联函数
类的成员函数可以分为内联函数和外联函数。
- 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。而说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现部分。
- 内联函数在调用时不是像一般函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度。
- 内联函数与带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义,因为内联函数遵循函数的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,调试比较方便。
- 外联函数变成内联函数的方法很简单,只要在函
数头前面加上关键字inline就可以了。
2.2 将成员函数以内联函数的形式进行说明
有两种格式将成员函数声明为类的内联函数:
- (1)隐式声明 直接将函数声明在类内部。
class Coord{
public:
void setCoord(int a,int b)
{ x=a; y=b;}
int getx()
{ return x;}
int gety()
{ retrun y;}
private:
int x,y;
};
- (2)显式声明
在类声明中只给出成员函数的原型,而成员函数体写在类的外部。为了使它起内联函数的作用,在成员函数返回类型前冠以关键字“inline”。
这种成员函数在类外定义的一般形式是:
inline 返回类型 类名::成员函数名(参数表)
{
// 函数体
}
class Coord{
public:
void setCoord(int,int);
int getx();
int gety();
private:
int x,y;
};
inline void Coord::setCoord(int a,int b)
{ x=a; y=b;}
inline int Coord::getx(){ return x;}
inline int Coord::gety(){ return y; }
说明
- (1)使用inline说明内联函数时,必须使函数体和inline说明结合在一起,否则编译器将它作为普通函