在 C++ 中,常量(constant)指的是在程序运行期间其值不能被修改的量。合理使用常量可以提高代码的可读性、安全性和维护性,并帮助编译器做优化。


一、为什么要用常量

  • ✅ 防止意外修改数据

  • ✅ 提高代码可读性(见名知意)

  • ✅ 便于维护和修改

  • ✅ 有助于编译期优化


二、C++ 中常量的主要形式

方式

说明

推荐程度

const

运行期或编译期常量

⭐⭐⭐⭐

constexpr

编译期常量(C++11 起)

⭐⭐⭐⭐⭐

字面常量

直接写在代码中的值

⭐⭐⭐

#define

宏常量(不推荐)

enum

枚举常量

⭐⭐⭐


三、const常量(最常用)

1️⃣ 基本用法

const int MAX_SIZE = 100;
MAX_SIZE = 200; // ❌ 错误:不能修改

2️⃣ const与指针

int a = 10;
const int* p1 = &a; // 指向常量的指针(值不能改)
int* const p2 = &a; // 指针本身是常量(地址不能改)
const int* const p3 = &a; // 都不能改

📌 口诀:

“左定值,右定向”


四、constexpr(强烈推荐)

👉 编译期就能确定的常量

constexpr int BUFFER_SIZE = 1024;

✅ 优点:

  • 编译期计算

  • 可用于数组大小、模板参数等

  • 更安全、更高效

constexpr int square(int x) {
    return x * x;
}

int arr[square(5)]; // OK(C++11 之后)

📌 优先用 constexpr,而不是 const


五、字面常量

42        // 整型常量
3.14      // 浮点常量
'a'       // 字符常量
"hello"   // 字符串字面量
true      // 布尔常量

⚠️ 字符串字面量是只读的

char* s = "abc";        // ❌ 不推荐
const char* s = "abc";  // ✅ 正确

六、枚举常量(enum/ enum class

传统枚举

enum Color {
    RED,
    GREEN,
    BLUE
};

强类型枚举(推荐 ✅)

enum class Status {
    OK,
    ERROR
};

Status s = Status::OK;

✅ 避免命名污染

✅ 类型安全


七、宏常量(不推荐 ❌)

#define PI 3.14

❌ 无类型检查

❌ 不易调试

✅ 仅用于兼容旧代码

👉 现代 C++ 中应改用 constexpr


八、常量成员函数(类中)

class Person {
public:
    int getAge() const {  // 常成员函数
        return age;
    }
private:
    int age;
};

✅ 承诺:不会修改对象状态


九、常见面试/易错点

constconstexpr的区别?

对比项

const

constexpr

是否一定编译期

是否可做数组大小

不一定

可以

推荐程度

一般

✅✅✅

❓ 常量一定要初始化吗?

是的

const int x = 10; // 必须初始化

十、最佳实践总结 ✅

  1. 能用 constexpr就别用 const

  2. 不用 #define定义常量

  3. 字符串用 const char*std::string

  4. 类中使用 const成员函数

  5. 枚举优先用 enum class


更多推荐