文章目录
类和对象的说明
类的外部是指类的定义之外以及类的成员函数定义之外。
类的成员又区分成数据成员(属性)和函数成员(方法)。
this指针
在类的成员函数的代码中,对类成员进行的直接访问或使用均隐含解释为是对“当前对象”的成员函数进行访问或使用。
使用this
指针来表示当前对象含义会更清晰。
关键字this
为一个系统提供的专用指针,它总是指向当前对象的。
return this
返回该当前对象的指针,return *this
返回该当前对象本身。
结构与类的区别
默认情况下,结构的成员是公有的,而类的成员是私有的。大多数有经验的程序员通过使用结构来“封装”若干数据的集合。而当描述数据成员又刻画其操作时使用类class。
构造函数和析构函数
构造函数
- 函数名与类名相同
- 无函数(返回)类型说明
- 构造函数在一个新的对象被建立时(说明语句、new函数创建),该对象所隶属的类的构造函数自动地被调用,对该对象完成初始化工作。
- 如果一个类说明中没有给出显式的构造函数,系统将自动给出一个默认的(隐式)构造函数。
<类名>(void){}
这个函数什么也不做。 - 如果说明中包括多个构造函数,系统在调用时一般按照函数重载的规则选择其中之一。
拷贝构造函数
一种特殊的构造函数,只含有一个形参,为本类对象。
<类名>(<类名>&)
Point obj2 = obj1;
Point obj3(obj1);
析构函数
专门用来在对象的生存期结束时做善后工作的,也是类的特殊成员函数。
- 析构函数名一律为
~<类名>
- 无函数返回类型
- 无参数
- 一个类只可以有一个析构函数,可缺省
- 在对象注销时,包括用delete函数释放动态对象时,系统会自动调用析构函数。
- 如果一个类说明中没有给出显式的析构函数,系统将自动给出一个默认的(隐式)析构函数。
~<类名>(void){}
这个函数什么也不做。
类与对象的其他特征
类的静态成员
由关键字static修饰的类成员说明为类的静态成员。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。
静态数据成员
Static float xcoord;
类中说明的静态数据成员属于形式化说明,还必须在类外对静态数据成员按如下格式进行实体化说明(仅能说明一次):
float Point::xcoord = 5;
静态函数成员
对类的静态函数成员的访问
<类名>::<静态函数成员调用>
或<对象名>.<静态成员函数调用>
类的静态成员函数和类的非静态成员函数的最大区别在于:
类的静态成员函数没有this指针,通常情况下类的静态函数只处理类的静态数据成员值。
类的常量成员
常量数据成员
在成员说明时不能被赋值,而只能在对象被说明时通过构造函数的成员初始化列表的方式来赋初值。一旦对象被创建,其常量数据成员的值就不允许被修改,任何类内外函数只能读取不能修改。
常量函数成员
常量类型的函数成员只有权读取相应对象,但无权修改它们。
<类型说明符><函数名>(<参数表>)const;
系统实现这一常量型函数成员是通过把隐含的this指针修改为:
const CC *const this;
实现的。
后面的const指出this的内容不变(总是指向该对象),前面的const指出*this不可改变。可以利用系统机制来实现修改:return ((CC*)this)->me++
友元和类之间的关系
友元函数和友元类
在类的说明语句中,应列出该类的友元,其关键字friend:
- 位于一个函数说明之前,指出该函数为这个类的友元函数
- 位于一个类名之前,指出该类是这个类的友元类
class A{
...
friend int f(int a);
...
friend class B;
...
}
在类中说明的友元函数有以下性质:
- 它不是类的函数成员
- 友元函数的定义可以在类内,也可以在类外’
- 友元函数有权访问类的私有和保护成员
在类中说明的友元类有以下性质:
- 它可能是与类无关的另一个类
- 友元类要在类外说明
- 友元类的任一函数都有权访问和调用类的所有成员
- 友元的关系是单向的、不传递的
类与类之间的关系
- 一个类的对象作为另一个类的成员
class pixel{
int x,y;
public:
pixel(){x=0;y=0;}
pixel(int x0, int y0){
x=x0;
y=y0;
}
};
class line{
pixel start,end;
int color;
public:
line(int sx, int sy, int ex, int ey, int col):
start(sx,sy),end(ex,ey){
color=col;
}
};
构造函数初始化列表给出对象成员的初始化。
类line的构造函数的定义需在函数体之前通过成员初始化符表把参数传到对象成员的构造函数中去。
<类名> (<参数总表>) : <初始化符表> {<构造函数体>}
在创建一个含有对象成员的类对象时,它的构造函数被系统调用,这时将按初始化符表来依次执行各对象成员的构造函数,完成各对象成员的初始化工作,而后执行本类的构造函数体。析构函数的调用顺序恰好与此相反。
如果对象成员的类未定义构造函数,成员初始化符可缺省,这时系统调用缺省构造函数创建成员对象。
实现不同类对象的包含关系还可以使用指向类对象的指针,由于对象指针是类的一般数据成员,所以不必如对象成员那样,在构造函数说明中加入成员初始化符表,而是直接在构造函数内进行初始化即可。
- 一个类作为另一个类的友元
- 一个类定义在另一个类的说明里,即类的嵌套(不推荐使用)
- 一个类作为另一个类的派生类
运算符重载用于用户定义类型
两种方式对运算符重载:
- 类成员方式
- 友元方式
class Set{
...
public:
//友元方式
friend bool operator & (int,Set);
//bool Set::operator &(int);
friend bool operator == (Set,Set);
friend bool operator != (Set,Set);
friend Set operator + (Set,int);
friend Set operator + (Set,Set);
//Set Set::operator(Set*),推荐使用友元方式
friend Set operator - (int,Set);
friend Set operator * (Set,Set);
friend bool operator < (Set,Set);
friend bool operator <= (Set,Set);
};