const对象只能调用const成员函数
- 常量成员函数 (const member function), 可读取类中的数据成员,但不能修改。利用这个特性来对成员函数加以修饰。
- const对象是不可以调用类中的非const成员函数。原因之后解释。
假设现在有如下代码:
class test{
int i;
public:
void print();
test(int i);
};
test obj1(12);
obj1.print();
默认this指针
对象调用成员函数时,在形参列表的最前面加一个形参this,但这是隐式的。this指针是默认指向调用函数的当前对象的,所以,很自然,this是一个常量指针test * const
,因为不可以修改this指针代表的地址。
但当成员函数的参数列表(即小括号)后加了const关键字(void print() const;
),此成员函数为常量成员函数,此时它的隐式this形参为const test * const
,即不可以通过this指针来改变指向对象的值。这就是“常量成员函数可读取类中的数据成员,但不能修改”的原因。
和Python有点像,在定义类的函数时,每个函数的参数列表的第一个参数必须为self
,这个用法和C++里的隐式this
应该是一样的。
调用函数时,会隐式传&obj1
obj1.print();
这一句其实相当于obj1.print(&obj1);
- 当对象为const对象时,即
const test obj1(12)
时,实参的类型为const test *
;当print为常量成员函数时,形参this的类型为const test * const
。转换时加了个顶层const,是可以的。所以const对象可以调用const成员函数。 - 当对象为const对象时,即
const test obj1(12)
时,实参的类型为const test *
;当print为非常量成员函数时,形参this的类型为test * const
。转换时会丢失底层const,这是不可以的。所以const对象不可以调用非const成员函数。 - 当对象为非const对象时,const成员函数和非const成员函数都可以调用。分析过程类似,反正实参的类型为
test *
,怎么转换都不可能出现丢失底层const这种情况啦。