c++ const 与成员函数

本文详细解析了C++中const成员函数的作用及使用规范,包括如何声明const成员函数、其内部不能修改成员变量的限制,以及mutable关键字的例外情况。

常见表示如:

 

成员函数加了const后相当于:

1. 告诉编译器,可以为const数据成员调用它.

2. const成员函数里,没有数据被改变,编译器也不允许你改变

3. 如果在const里调用了一个不是const的成员函数,会出错.

4. 特殊:声明为mutable的成员可以在这个函数中改变

 

 

上面的代码就是告诉编译器,不会修改 err 值

### 原理 const修饰类成员函数时,实际修饰的是该成员函数隐含的this指针,这表明在该成员函数中不能对类的任何非mutable成员进行修改,也不能调用非const成员函数[^1][^3]。例如: ```cpp class C { int x; public: C(int v): x(v) {} int getX() const { // 常量成员函数 return x; // 只能访问 x,不可修改 } void setX(int v) { // 非 const 函数 x = v; } }; ``` 在`getX()`函数中,由于使用了const修饰,this指针指向的对象状态不能被修改,因此只能访问x,而不能修改它[^3]。 ### 用法 - **保证不修改对象状态**:const成员函数的主要作用是保证不修改对象的状态,像访问器方法(getter)通常应是const,因为它们仅读取对象状态,而不修改它。例如: ```cpp class MyClass { public: int getValue() const { return value; } private: int value; }; ``` 在上述代码中,`getValue()`函数是一个const成员函数,它只是返回对象的`value`成员,不会对对象状态进行修改[^2]。 - **传递const对象**:在函数参数为const对象引用时,只能调用对象的const成员函数。例如: ```cpp class Date { public: Date(int year = 2024, int month = 3, int day = 16) { _year = year; _month = month; _day = day; } void print() const { std::cout << _year << " " << _month << " " << _day << std::endl; } private: int _year; int _month; int _day; }; void f1(const Date& d) { d.print(); } int main() { Date d1; d1.print(); Date d2; f1(d2); return 0; } ``` 在`f1`函数中,参数`d`是一个const引用,因此只能调用`Date`类的const成员函数`print()` [^1]。 ### 注意事项 - **权限问题**:非const成员变量可以调用const成员函数,因为权限可以缩小;而const成员变量只能传入const修饰的函数中,权限不能放大。例如: ```cpp class A { public: void Print(A d) const {} // 上面的函数相当于此处的函数 // void Print(const A* this, A d) {} private: int _age; }; int main() { const A d(10); return 0; } ``` `A`类的非const对象可以调用`Print`函数,而const对象也可以调用该const成员函数,但const对象不能调用非const成员函数 [^4]。 - **不能修改非mutable成员**:在const成员函数中,不能修改任何非mutable成员,也不能调用非const成员函数。如果需要在const成员函数中修改某些成员,可以将这些成员声明为mutable [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值