const 在 C++ 中可以出现在函数声明的多个位置,不同的位置有不同的含义。我们可以看到 const 出现在函数声明的前面或结尾,它们的作用不同。下面来解释这两种情况。
- const 放在函数返回类型前
当 const 放在函数返回类型之前时,表示返回的值是常量,即该函数返回的值不能被修改。例如:
const int getValue() {
return 5;
}
含义:函数返回的 int 类型值是常量,调用者不能修改返回值。例如,不能将返回的值作为左值(L-value)。
应用场景:主要用于防止调用者对返回值进行修改,确保返回的值保持不变。
int main() {
const int result = getValue(); // result 是常量
// result = 10; // 错误,不能修改常量
return 0;
}
注意:如果函数返回的是基本数据类型(如 int),在大多数情况下加 const 意义不大,因为返回值是拷贝,无法修改原值。但如果函数返回的是指针或引用,const 变得有意义。
- const 放在函数的结尾
当 const 出现在函数定义的结尾(靠近参数列表之后),它用于修饰类的成员函数,表示该成员函数不会修改对象的成员变量。例如:
class MyClass {
public:
int getValue() const {
return value;
}
void setValue(int val) {
value = val;
}
private:
int value = 0;
};
含义:const 修饰的成员函数不能修改当前对象的成员变量,也不能调用其他非 const 成员函数。即该函数只能读取对象的状态,而不能修改它。
应用场景:当你希望保证某个成员函数不改变对象的状态时,可以将其声明为 const 成员函数。
例如:
int main() {
const MyClass obj; // 常量对象
obj.getValue(); // 可以调用
// obj.setValue(10); // 错误,常量对象不能调用非 const 成员函数
return 0;
}
getValue() 是 const 成员函数,因此可以在 const 对象上调用。
setValue() 没有 const 修饰,不能在 const 对象上调用,因为它可能修改对象的成员变量。
总结
const 放在函数返回类型前:表示返回的值是常量,调用者不能修改返回的值,通常用于返回指针或引用时防止修改数据。
const 放在函数结尾(类成员函数):表示这个成员函数不会修改当前对象的成员变量,也不能调用其他非 const 成员函数,用于保持对象的状态不被改变。
这两种 const 关键字的位置和作用不同,需要根据具体的情况使用。