目录
1. const修饰成员函数
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
1.1 语法格式
在成员函数的声明中使用const关键字的语法格式为:
返回类型 函数名() const;
在成员函数的定义中使用const关键字的语法格式为:
返回类型 类名::函数名() const {
// 函数体
}
1.2 权限放大缩小
const 修饰的权限放大(扩大)或缩小(缩小)取决于成员函数和成员变量的修饰符。
-
成员函数:
- 如果一个非const成员函数被const修饰符修饰,它的权限会缩小,即它不能修改对象的非mutable成员变量,也不能调用非const成员函数。
- 如果一个const成员函数被const修饰符修饰,它的权限保持不变,即它不能修改对象的任何成员变量,也不能调用非const成员函数。
-
成员变量:
- 如果一个非const成员变量被const修饰符修饰,它的权限会缩小,即它只能被const成员函数访问,而非const成员函数不能修改它。
- 如果一个const成员变量被const修饰符修饰,它的权限保持不变,即它不能修改对象的任何成员变量,也不能调用非const成员函数。
class Example {
private:
int data;
const int constData;
mutable int mutableData;
public:
void nonConstFunc() {
data = 10; // 可以修改非const成员变量
constData = 20; // 错误!不能修改const成员变量
mutableData = 30; // 可以修改mutable成员变量
constFunc(); // 可以调用const成员函数
nonConstMemberFunc(); // 可以调用非const成员函数
}
void constFunc() const {
data = 10; // 错误!不能修改非mutable成员变量
constData = 20; // 错误!不能修改const成员变量
mutableData = 30; // 可以修改mutable成员变量
nonConstMemberFunc(); // 错误!不能调用非const成员函数
}
void nonConstMemberFunc() {
// 省略函数体
}
};
1.3 思考
1. const对象可以调用非const成员函数吗?
2. 非const对象可以调用const成员函数吗?
3. const成员函数内可以调用其它的非const成员函数吗?
4. 非const成员函数内可以调用其它的const成员函数吗?