1. const
修饰整个函数(常量成员函数)
当const
修饰整个函数时,它表明该函数是一个常量成员函数,即它不会修改调用它的对象的任何成员变量(非静态成员变量)。这通常用于保证对象的状态在函数调用过程中不被改变。
class MyClass {
private:
int value;
public:
MyClass(int v) : value(v) {}
// 常量成员函数,不会修改成员变量
int getValue() const {
return value;
}
// 非常量成员函数,可以修改成员变量
void setValue(int v) {
value = v;
}
};
int main() {
MyClass obj(10);
const MyClass constObj(20); // 创建一个常量对象
// 可以调用常量对象的常量成员函数
int val = constObj.getValue();
// 下面的代码会编译错误,因为尝试通过常量对象调用非常量成员函数
// constObj.setValue(30); // 错误:不能通过常量对象调用非const成员函数
return 0;
}
2. const
修饰返回值
当const
修饰返回值时,它通常用于表明返回的引用或指针指向的对象在函数外部不会被修改。这主要用于保护返回的对象不被意外修改。
class MyClass {
private:
std::string data;
public:
MyClass(const std::string& str) : data(str) {}
// 返回对内部数据的常量引用,确保外部不能修改它
const std::string& getData() const {
return data;
}
};
int main() {
MyClass obj("Hello");
const std::string& ref = obj.getData(); // 获取数据的常量引用
// 下面的代码会编译错误,因为尝试修改通过常量引用获取的数据
// ref[0] = 'h'; // 错误:不能修改通过const引用获取的对象
return 0;
}
3. const
修饰参数
当const
修饰参数时,它表明该参数在函数内部不会被修改。这有助于向调用者传达函数不会改变其传入参数的信息,并可能允许函数接受更广泛的参数类型(例如常量对象或临时对象)。
void printString(const std::string& str) {
// 函数内部不会修改str
std::cout << str << std::endl;
}
int main() {
std::string myString = "World";
const std::string constantString = "Constant";
// 可以将const std::string传递给printString,因为printString保证不会修改它
printString(constantString);
// 也可以将非const std::string传递给printString
printString(myString);
return 0;
}
在这些例子中,const
的使用帮助提高了代码的健壮性和可读性,通过明确表明哪些部分是不应该被修改的。在设计和编写函数时,应该仔细考虑哪些部分应该是const
的,以确保代码的正确性和可维护性。