您的位置:首页 > 其它

const 和非 const 函数重载

2012-12-31 00:36 197 查看
转载自:http://zhidao.baidu.com/question/55437904.html

class a

{

public:

int x()

{......}

int x() const

{......}

};

这样的 const 重载是允许的 但是什么时候会调用 x()

什么时候会调用 x() 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;

}

这样再重新编译的时候就不会出现错误了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: