今天写代码发现编译器报这种错:
看了很久,最后在网上找到原因(文章链接)
简化代码复现问题,代码如下:
class A
{
public:
A(int a)
{
m_a = a;
}
void set_a(int a)
{
m_a = a;
}
int get_a()
{
return m_a;
}
int aaaa;
private:
int m_a;
};
int ChangeFun(const A*a)
{
return a->get_a();
}
int main()
{
A *a = new A(5);
a->set_a(3);
ChangeFun(a);
a->get_a();
system("pause");
return 0;
}
这段代码编译是通不过的,会报前面图中的错误。
原因分析
这里的原因就是因为这个const,一般为了防止对象被修改,经常的会形参前面加上一个const,对于这段代码来说看上去好像没有什么问题,这里只是调用了一下它的get函数,并没有改变它的值(反正我自己刚开始也是这么觉得)。
但实际上,将指针a传入ChangFun前,a所指的对象实例不是const的,是可以改变的,a->set_a(3);
是没有问题的,在进入到函数之后,实例就变成了const类型了,是不能修改的(里面的this指针类似于const (*const this))而此时去调用它的get函数是会失败的,因为get函数目前只支持(*const this)的调用,所以就会提示不能从“const A”转换为"A&" 。
(如果解释有问题,欢迎指正,共同进步😊)
解决
两种方法解决:
1.在成员函数后加上const :int get_a() const
,这样const就统一了,就不会报错了。
2.不用const(不推荐)
PS:如想学习C++的基础知识或者需要适合初学者的Demo可以直接访问我的代码仓库:点此跳转 (您的star🧡或者issues就是对我最大的鼓励)