-
this指针
先看C++程序到C程序的翻译过程:
this指针的作用:指向成员函数所作用的对象。
非静态成员函数中可以直接使用this指针来代表指向该函数作用的对象的指针。
静态成员函数中不能使用this指针;
因为静态成员函数并不具体作用于某个对象,
因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数。
例题:
下列说法不正确的是:
1、静态成员函数中不能使用this指针
2、this指针就是指向成员函数所作用的对象的指针
3、每个对象的空间中都存放着一个this指针
4、类的非静态成员函数,其真实的参数个数比所写的参数多1
正确答案:3.
-
静态成员
在定义前加了static关键字的成员。
普通成员变量每个对象都有各自的一份,而静态成员变量一共就一份,为所有对象共享。
sizeof不会计算静态成员变量。
例如:
class CMyclass{
int n;
static int s;
};
sizeof(CMyclass)等于4.
普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。
因此静态成员不需要通过对象就能访问。
如何访问静态成员?
1、类名::成员名
2、对象名.成员名
3、指针—>成员名
4、引用.成员名
静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
静态成员函数本质上是全局函数。
上面程序的输出结果是:
2,13
2,13
注意:在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
-
成员对象和封闭类
有成员对象的类叫做封闭类。
上例中,如果CCar类不定义构造函数,则下面的语句会编译出错:
CCar car;
因为编译器不明白car.tyre该如何初始化,car.engine的初始化没问题,用默认的构造函数即可。
注意:任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。
具体的做法就是通过封闭类的构造函数初始化列表。
封闭类实例:
封闭类构造函数和析构函数的执行顺序:
封闭类对象生成时,先执行所有对象成员的构造函数,然后才执行封闭类的构造函数。
对象成员的构造函数调用次序和对象成员在类中的说明顺序一致,
当封闭类的对象消亡时,先执行封闭类的析构函数,然后再执行成员对象的析构函数。
-
封闭类的复制构造函数
封闭类的对象,如果是用默认复制构造函数初始化的,那么它里面的包含的成员对象,也会用复制构造函数初始化。
-
友元
友元分为友元函数和友元类两种。
友元函数:一个类的友元函数可以访问该类的私有成员。
可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元。
友元类:如果A是B的友元类,那么A的成员函数可以访问B的私有成员。
友元类之间的关系不能传递,不能继承。
-
常量成员函数
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。
在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
常量成员函数内部不能改变属性的值,也不能调用非常量成员函数。