为了账号安全,请及时绑定邮箱和手机立即绑定

不是很理解const和非const函数重载,求解释~

不是很理解const和非const函数重载,求解释~

ibeautiful 2021-11-25 21:11:56
class a{public:int x(){......}int x() const{......}};这样的const重载是允许的 但是什么时候会调用 x()什么时候会调用x() const ? 他们又有什么不同呢?
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

const a a1;
a a2;
a1.x();
a2.x();

a1调用const版本,a2调用非const版本。

后面加const表示在该函数中不能对类的数据成员进行改变,
比如:

class A
{
private:
int aa;
public:
int x()
{
return aa++;
} //这可以
int x() const
{
return aa++;//这错误
}
};
当然有特殊情况,就是用mutable关键字修饰过的成员变量可以在声明为const 函数中被改变。
关于mutable:

关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员
我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,
对像的状态也会随之发生变化!
如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是
该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员
进行赋值.这个时候就需要用到mutable关键字了

例如:
class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}

编译上面的代码会出现 error C2166: l-value specifies const object的错误
说明在const类型的函数中改变了类的非静态数据成员.

这个时候需要使用mutable来修饰一下要在const成员函数中改变的非静态数据成员
m_nAccess,代码如下:

class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
mutable int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}

这样再重新编译的时候就不会出现错误了!



查看完整回答
反对 回复 2021-11-29
?
ITMISS

TA贡献1871条经验 获得超8个赞

const函数是常成员函数,他只能由常对象调用,他是常对象唯一的对外接口,所以是常对象的就调用const函数,其他的调用非const函数

查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信