从成员函数说起
在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this。
1 int getValue(T *const this) 2 { 3 return val; 4 }
const成员函数
声明形式是:int getValue() const;
编译器内部实现如下
1 int getValue(const T* const this) 2 { 3 return val; 4 }
表示this指针指向的内容是不可改变的,所以当试图修改val时会编译报错。
const对象
当一个对象声明成const时,表示指向它的this指针也是const的了,变成const T *this。如果此时调用一个非const成员函数,如int getValue(),而不是int getValue() const,那么相当于把const T*this赋值给T *const this,当然会报错。所以这时候要添加一个const版本的int getValue() const,编译就能通过了。
1 T *this = const T *this;
当然普通非const对象调用const成员函数也是可行的,反之不行。
const成员函数调用非const成员韩函数也是不可行的,相当于把 const T*this赋值给T *this,也会编译报错。