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);

  1. 当对象为const对象时,即const test obj1(12)时,实参的类型为const test *;当print为常量成员函数时,形参this的类型为const test * const。转换时加了个顶层const,是可以的。所以const对象可以调用const成员函数。
  2. 当对象为const对象时,即const test obj1(12)时,实参的类型为const test *;当print为非常量成员函数时,形参this的类型为test * const。转换时会丢失底层const,这是不可以的。所以const对象不可以调用非const成员函数。
  3. 当对象为非const对象时,const成员函数和非const成员函数都可以调用。分析过程类似,反正实参的类型为test *,怎么转换都不可能出现丢失底层const这种情况啦。
posted @ 2019-07-13 22:39  allMayMight  阅读(773)  评论(1编辑  收藏  举报