7. const与类的数据成员
const修饰的数据成员不能在构造函数中进行初始化,只能使用成员初始化列表进行初始化。
我的理解是,因为在构造函数执行之前,使用成员初始化列表对数据成员进行初始化,如果在构造函数中对数据成员进行初始化,相当于对const进行二次赋值,这是不被允许的。
之所以这么理解,可以参照类中引用类型的初始化,也是必须在初始化列表中进行初始化,因为引用类型也是在定义的时候必须初始化,要求和const一样,所以二者都只能使用成员初始化列表来进行初始化。
8. const与类的成员函数
const成员函数中,const位于函数的参数列表后面(函数声明前面表示函数的返回值是一个常量)
const修饰的成员函数表示成员函数是一个只读的作用,不改变成员变量。
const成员函数真正的含义在于,const其实修饰的成员函数的是隐含参数this指针,也就是说传入的是const ClassType *this,因为this指向一个const对象,所以不能修改。
因为this是指向对象的指针,所以我们需要再次结合const与指针的知识:
(1)const修饰了this,得到const ClassType *this,this指向一个“自认为”是const的对象(也就是本身),所以任何对象(const或者非const)都可以调用一个const成员函数,因为传入的指针都把自身这个对象看作是const对象,所以不能被修改。
(2)对于一个const对象,当其调用成员函数的时候,默认都传入this指针参数,因为this此时指向一个const对象(本身),所以相当于成员函数被const修饰,成员函数是一个const成员函数,所以反过来说,const对象只能调用const成员函数,因为非const修饰的成员函数,this指针不是指向const对象。
(3)在8.2的基本上,进一步,每个成员函数都可以调用其他成员函数,每个成员函数都传入this指针,所以成员函数相互调用必须保持this指针的一致性,所以const成员函数只能调用const成员函数,因为二者传入的this指针都是const修饰的。对于非const成员函数,其传入非const修饰的this指针,所以不能被调用。
搞清楚const真正的含义就明白了,一定要保持const成员函数传入的是const指针这个意识,对象调用就需要看对象(本身,指针,引用)是否是const。
注:相关教程知识阅读请移步到C++教程频道。










