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这种情况啦。
  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值