编译器报错:不能将“this”指针从“const A”转换为“A&”

本文探讨了C++中const关键字导致的编译错误,重点在于const对象在函数调用中的行为。通过实例说明了为何const限制了成员函数的修改,并提供了两种修正方法:在get_a函数上添加const和不使用const。适合初学者理解const在函数参数传递中的作用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

今天写代码发现编译器报这种错:
看了很久,最后在网上找到原因(文章链接)


简化代码复现问题,代码如下:

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就是对我最大的鼓励)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值