C++ const成员函数中成员的隐含类型

最近在写项目遇到一个之前忽略的有关const 成员函数的特性:

class sample
{
public:
	sample(int* p)
		: _p (p)
	{}
private:
	int* _p;
};
class Test {
public:
	void getA() const
	{
		sample s(&a);
	}
private:
	int a;
	int b;
};

实例代码如上,乍一看好像没啥问题。但实际编译时编译器给出这个错误

明明有一个参数是int*的构造函数,而且传递的也是int*,为什么会说没有找到参数类型为const int*的构造函数呢?后来回想了一下,首先这是一个const成员函数,它的this指针应该包含顶层const和底层const。也就是它除了最基本的不能改变对象的指向外,还不能对对象的值或属性进行修改。那么对象的属性我们可以理解为一个类的成员变量。而且成员函数中的变量我们可以理解为实际引用方式为  this->变量,如果换成图中的代码的话则应该是this->a。而this可以认为是const Test* const 类型。作为一个Test类型的整体既然它无法修改其值或内部属性,那么通过this指针引用变量a时,自然也需要为其加上一层const属性,否则就不能保证其内部属性无法修改。所以在这个const函数中 a的类型变成了const int*,而const int* 不能向int*类型进行赋值。所以编译报错。

解决方法: 

    1. 将变量声明为mutable  这样可以使得其即使在const成员函数中依然可以修改其值。

    2. 执行强制类型转换   const_cast<int*>(&a)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值