const 成员函数

一般来说,任何一个类如果期望被广泛使用,就应该把那些不修改类数据成员的成员函数声明为const 成员函数,但是,把一个成员函数声明为const 并不能阻止程序员可能做到的所有修改动作, 把一个成员函数声明为 const 可以保证这个成员函数不修改类的数据成员,但是 如果该类含有指针 那么在 const 成员函数中就能修改指针所指的对象 编译器不会 把这种修改检测为错误 这常常令 C++初学者吃惊 例如 
 
#include <cstring>
class Text {
public:
 void bad( const string &parm ) const;
private:
 char *_text;
};
 
void Text::bad( const string &parm ) const
{
 _text = parm.c_str(); // 错误: 不能修改 _text
 for ( int ix = 0; ix < parm.size(); ++ix )
  _text[ix] = parm[ix]; // 不好的风格, 但不是错误的
}
     尽管_text 不能被修改 但是_text 的类型是 char* 在类 Text 的 const 成员函数中可以修
改_text 指向的字符 成员函数 bad()反映了一种不良的程序设计风格 但是编译器不能帮助
检测出这样的情况 只有程序员自己保持警惕 因为 const 成员函数不能保证 在调用成员
函数期间类对象引用的所有东西都保持不变  。

 

//from <<C++ Primer>>

在 C++ 中,const 成员函数是一类特殊的成员函数,有着重要的作用,它使得程序员能够显式地控制对象的可变性,提高了代码的安全性和可维护性,是编写高质量 C++ 代码的重要一环 [^2]。 #### 概念 const 成员函数是用 const 关键字修饰的成员函数。在函数声明和定义时,在参数列表后加上 const 关键字,表明该函数不会修改对象的状态,即不会改变对象的数据成员。例如: ```cpp class MyClass { private: int data; public: // 声明 const 成员函数 int getData() const; }; // 定义 const 成员函数 int MyClass::getData() const { return data; } ``` #### 用法 - **访问常量对象**:const 成员函数可以被常量对象调用。常量对象是用 const 修饰的对象,只能调用 const 成员函数,以保证对象状态不被修改。 ```cpp const MyClass obj; int value = obj.getData(); // 调用 const 成员函数 ``` - **提高代码安全性**:在函数实现中,编译器会检查 const 成员函数是否修改了对象的状态,如果尝试修改,会引发编译错误,从而避免意外修改对象状态。 #### 特点 - **对象状态不变性**:const 成员函数承诺不会修改调用它的对象的状态,这在多线程环境下尤为重要,因为多个线程可以同时调用同一个对象的 const 成员函数而不会产生数据竞争问题 [^1]。 - **重载机制**:const 成员函数可以和非 const 成员函数进行重载。根据对象是否为常量来决定调用哪个版本的函数。 ```cpp class MyClass { private: int data; public: int getData() { // 非 const 版本 return data; } int getData() const { // const 版本 return data; } }; int main() { MyClass obj; const MyClass constObj; obj.getData(); // 调用非 const 版本 constObj.getData(); // 调用 const 版本 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值