永发信息网

const和非const函数重载

答案:2  悬赏:20  手机版
解决时间 2021-02-17 21:05
const和非const函数重载
最佳答案
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;
}

这样再重新编译的时候就不会出现错误了!
全部回答
const函数是常成员函数,他只能由常对象调用,他是常对象唯一的对外接口,所以是常对象的就调用const函数,其他的调用非const函数
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
要修道一般去哪里拜师?
佛平寺我想知道这个在什么地方
用路由器接两台电脑不能同时玩DNF
单选题在亚洲西部,有一条弧形的狭长地带,有
想知道:湘潭市 从湘潭北站到青山桥镇怎么坐公
好奇怪啊?英语翻译问题
杂交过程中不断除去aa,自交n代后,杂合子所
花瓶能不能放土种花
我觉得自己做事挺严谨的,平时说话也很有分寸
137平米的房子装修要多少钱
我拉菠菜到东莞虎门,货主(王)卖了六天,卖完
比84年大7岁属什么
《西厢记.长亭送别〉中的曲文是如何体现莺莺
被誉为国粹的京剧形成于A.宋朝B.元朝C.明朝D.
化肥的施肥浓度是百分之几
推荐资讯
听见冬天的窗外,我在某年某月醒过来。是什么
【契】""默契""""契""的意思意思!
听说现在星海萨克斯都是假的,04年的星海萨克
太阳能热水器坏了,可以安装天然气热水器吗?
都匀市河阳小堡种养殖专业合作社地址有知道的
人为什么小腿骨容易骨折
峰帆我想知道这个在什么地方
为什么好多院校的调剂信息还没出,还是根本不
从佛山南海西憔怎么坐车去惠来
化了妆以后如何才能不让它掉妆???急急急!
电机接电源后不转,只是嗡嗡作响,电机发热厉
武进妇幼保健所不可以做排畸彩超吗?那检查的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?