在C++中,const关键字用来表达“只读”或“不可修改”的语义。它不仅可以修饰普通变量,还能修饰指针、函数参数、返回值以及类的成员函数。合理使用const能够提高代码的安全性和可读性,也能让编译器帮忙发现潜在的错误。

修饰常量变量
用const修饰的变量在初始化后就不能再被赋值,任何修改尝试都会导致编译错误。
#include <iostream>
int main() {
const int max_count = 10;
// max_count = 20; // 编译错误:不能修改常量
std::cout << max_count << std::endl;
return 0;
}
修饰指针
const修饰指针时有两种情况:指向常量的指针和常量指针。前者不能通过该指针修改所指对象,后者本身不能指向别的地址。
int a = 1, b = 2; const int* p1 = &a; // 指向常量,*p1不可改 int* const p2 = &a; // 常量指针,p2不可改指向 // *p1 = 3; // 错误 p1 = &b; // 合法 // p2 = &b; // 错误 *p2 = 3; // 合法
修饰函数参数与返回值
函数参数使用const可以避免函数内部误改实参,尤其是传递引用或指针时。返回值加const能防止调用者对临时结果赋值。
#include <string>
// 参数用const引用,避免拷贝且不可修改
void print(const std::string& s) {
std::cout << s << std::endl;
}
// 返回const值,防止类似 getNum() = 5 的写法
const int getNum() {
return 42;
}
修饰成员函数
在类的成员函数声明后加上const,表示该函数不会修改对象的非静态成员变量(除非被mutable修饰),常量对象只能调用这类函数。
#include <iostream>
class Counter {
public:
Counter() : value(0) {}
void increment() { value++; }
int get() const { return value; } // const成员函数
private:
int value;
};
int main() {
const Counter c;
// c.increment(); // 错误:常量对象不能调用非const函数
std::cout << c.get() << std::endl;
return 0;
}
常见注意点
- const对象只能调用const成员函数。
- 非const成员函数可以调用const成员函数,反之不行。
- 如果确实需要修改某个成员变量,可将其声明为mutable。
| 修饰位置 | 主要作用 |
|---|---|
| 变量 | 定义不可修改的常量 |
| 指针 | 限制指针本身或所指对象被修改 |
| 函数参数 | 保护传入数据不被改动 |
| 返回值 | 防止对返回结果赋值 |
| 成员函数 | 表明不修改对象状态 |
理解并熟练运用const的各种用法,是编写健壮C++程序的重要基础。它把很多运行期错误提前到编译期,也让代码意图更加清晰。