记录一下C++中const的使用,主要涉及const修饰指针、变量,函数、对象等情况下的使用,简单记录于此,方便自己查阅。
正文
在 C++ 中,const(常量)关键字是构建安全、规范、高性能代码的基石。它不仅仅用来声明“不可修改的值”,更重要的是用于表达接口契约和编译期约束,从而在编译阶段提前捕获错误。
修饰变量
const 修饰变量后,该变量在生存期内不可被修改,且定义时必须初始化。
:
const int MAX_SIZE = 100;常数组:
const int arr[5] = {1, 2, 3, 4, 5};优势:相比于 C 语言的
#define宏,const具有类型检查,且可以节省不必要的内存分配(编译器通常不会为const变量分配内存,而是直接替换为字面量)。
修饰指针与引用
const 在指针和引用中用于限制修改权限,分为“底层 const”(修饰指向的内容)和“顶层 const”(修饰指针本身)。
常量指针:
const int *p;(指向的内容不可变,指针可换指向)指针常量:
int * const p;(指针指向不可变,内容可改)常量引用:
const int &r = a;(不能通过引用r修改a的值)
安全准则:降低权限是安全的(例如将
int*赋值给const int*),但提升权限(将const int*赋给int*)是危险的,编译器会报错。
修饰函数参数
在函数传参时,尤其是传递大对象(如 std::string, std::vector)时,强烈建议使用 const Type&(常量引用)。
作用:告诉编译器该参数在函数体内是只读的,防止函数内部意外修改传入的数据,同时避免了对象的拷贝开销。
示例:
void print(const std::string &str);
修饰成员函数与对象
这是面向对象编程中 const 最核心、也最容易被忽视的用法。
const 成员函数:将
const放在成员函数参数列表的右侧(如int getValue() const;),表示这是一个“只读”函数。该函数承诺不会修改类的任何非静态数据成员,也不能调用其他非const的成员函数。const 对象:一旦将对象定义为
const(如const MyClass obj;),它就只能调用const成员函数。const 函数重载:C++ 允许仅凭
const来重载成员函数。非const对象优先调用非const版本,const对象只能调用const版本。
class MyClass {
public:
// 非 const 版本:允许修改内部状态
std::string& getData() {
return data;
}
// const 版本:只读访问
const std::string& getData() const {
return data;
}
private:
std::string data;
};mutable 关键字
如果一个类的成员函数被声明为 const,但确实需要在其中修改某个不影响对象核心逻辑状态的变量(例如:缓存数据、访问次数统计、日志标记),可以使用 mutable 关键字修饰该成员变量。
class Message {
private:
std::string text;
mutable int accessCount = 0; // 允许在 const 函数中修改
public:
void print() const {
accessCount++; // 合法操作
std::cout << text << std::endl;
}
};总结来说,在 C++ 中养成“默认使用 const”的习惯(如默认使用 const & 传参、默认将不修改状态的成员函数标记为 const),能极大地提升代码的健壮性和可维护性。

