const修饰类成员函数的作用
- 保证对象状态的安全性:表明该成员函数不会修改对象的成员变量(除了用mutable修饰的成员变量),使得在使用常量对象时也能调用该函数,增强代码的安全性和可读性。例如,一个用于获取对象内部数据但不改变其状态的函数适合声明为const成员函数。
对函数实现的具体限制
- 不能修改成员变量:在函数实现中,不能对非mutable的成员变量进行赋值等修改操作。例如:
class MyClass {
private:
int data;
public:
int getData() const {
// data = 10; // 错误,不能在const成员函数中修改非mutable成员变量
return data;
}
};
- 只能调用其他const成员函数:在该const成员函数内部,只能调用类的其他const成员函数,以确保不会意外修改对象状态。例如:
class MyClass {
private:
int data;
public:
int getData() const {
anotherFunction(); // 假设anotherFunction也是const成员函数,这样调用合法
return data;
}
void anotherFunction() const {}
};
对函数调用的具体限制
- 常量对象只能调用const成员函数:如果对象被声明为const,那么只能调用其const成员函数,否则编译会报错。例如:
class MyClass {
private:
int data;
public:
int getData() const {
return data;
}
void setData(int newData) {
data = newData;
}
};
int main() {
const MyClass obj;
obj.getData(); // 合法,调用const成员函数
// obj.setData(10); // 错误,常量对象不能调用非const成员函数
return 0;
}
- 非常量对象可以调用const和非const成员函数:非常量对象既可以调用const成员函数,也可以调用非const成员函数。例如:
class MyClass {
private:
int data;
public:
int getData() const {
return data;
}
void setData(int newData) {
data = newData;
}
};
int main() {
MyClass obj;
obj.getData(); // 合法,调用const成员函数
obj.setData(10); // 合法,调用非const成员函数
return 0;
}