加了const的对象,就只能调用const的成员函数。反过来,成员函数没有加const,就只能被非const对象调用,如果用const对象去调用会导致编译错误。
什么时候用const限定符
1. 常量数据
- 如果数据不会改变(例如常量或定义后不再修改的变量),应将其声明为
const
。这样做不仅可以提高代码的可读性,还可以防止意外修改数据。
const double pi = 3.14159;
2. 成员函数
- 对于成员函数,如果函数不修改类的任何成员变量,则应该将其声明为
const
。这不仅使代码更加清晰,而且编译器可以允许const
对象调用这些函数。 - getter 函数通常都应该使用
const
,以保证它们不会修改对象状态,并且可以在const
对象上调用。
class Student {
string name;
int id;
float grade;
public:
string getName() const; // getter 函数通常声明为 const
int getID() const;
float getGrade() const;
void setName(const string& inputName);
void setID(int inputId);
void setGrade(float inputGrade);
};
3. 函数参数
- 如果函数参数不会在函数内部被修改,应该将其声明为
const
。这适用于通过引用或指针传递的参数。【其实这种常量引用就相当于是省内存的“值传递”】 - 增强了代码的可读性,让读者明确知道在这段代码中不会有任何修改操作。
- 如果未来代码需要维护和更新,其他开发者一眼就能看出这里的对象是只读的。
void printStudent(const Student& student);
4. 返回值
- 如果函数返回的是一个不应该被修改的对象,应该将返回类型声明为
const
。
const string& getName() const;