const 用于修饰只读对象,被修饰后值不可修改,有类型、作用域,是 C++ 主力常量用法。下面分场景逐一讲解。

const 类型 变量名 = 初始值;
强制要求:必须初始化,定义后不能再赋值修改。
#include <iostream>
using namespace std;
int main()
{
const int num = 100;
const double pi = 3.14159;
// num = 200; // 编译报错:const 只读,无法修改
cout << num << " " << pi << endl;
return 0;
}
extern:// 文件A.cpp extern const int g_val = 10; // 文件B.cpp extern const int g_val; // 声明,可使用
const 可以是运行时常量,允许用普通变量初始化:
int a = 20; const int b = a; // 合法,运行时确定值
根据 const 位置不同,含义完全不同,分三类记忆。
格式:const 类型* 指针名
int x = 1, y = 2; const int* p = &x; p = &y; // ✅ 指针指向可以变 // *p = 100; // ❌ 指向的值不能修改
格式:类型* const 指针名
int x = 1; int* const p = &x; // 定义时必须初始化 *p = 100; // ✅ 内容可改 // p = &y; // ❌ 指针指向不能变
格式:const 类型* const 指针名
int x = 1; const int* const p = &x; // *p = 100; ❌ // p = &y; ❌
快速判断技巧:看
const靠近谁,谁就不能改。
引用本身等价于变量别名,const 修饰引用表示不能通过引用修改原数据。
格式:const 类型& 引用名
int a = 10; const int& r = a; // r = 20; // ❌ 不能通过引用修改 a a = 20; // ✅ 原变量本身可以修改
常用场景:函数传参,避免拷贝 + 保护数据。
目的:保护实参不被函数修改,推荐搭配引用/指针使用,减少拷贝。
// 不允许修改传入的字符串
void print(const string& s)
{
cout << s << endl;
// s = "test"; 报错
}
一般用于返回指针/引用,防止外部修改返回的内容:
const int& getVal(int& a)
{
return a;
}
int main()
{
int x = 10;
const int& res = getVal(x);
// res = 20; 报错
return 0;
}
普通值返回加 const 无意义。
const 写在函数参数列表后面,表示:
该函数不会修改类的任何成员变量,也不能调用非 const 成员函数。
语法:
返回值 函数名(参数) const;
示例:
class Test
{
private:
int num = 10;
public:
// const 成员函数
void show() const
{
cout << num << endl;
// num = 20; ❌ 不能修改成员变量
}
};
规则:
const 成员函数内,禁止修改成员变量。const 对象只能调用 const 成员函数。const 成员函数不能调用普通(非 const)成员函数。类内 const 成员变量,必须在构造函数初始化列表初始化,不能在构造函数体内赋值。
class A
{
private:
const int val; // const 成员
public:
// 只能在初始化列表赋值
A() : val(100)
{
// val = 100; ❌ 体内赋值报错
}
};
const_cast(谨慎使用):const int a = 10; int* p = const_cast<int*>(&a); *p = 20; // 不推荐,修改原 const 常量是未定义行为
const 类型 变量 = 值,只读不可改。const T*:内容不可改,指针可改T* const:指针不可改,内容可改const T* const:全都不可改const T&,禁止通过引用改原数据。const 保护实参,优先引用传参。const,承诺不修改成员。