最近在写项目遇到一个之前忽略的有关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)