目录

  1. 常量概述
  2. const 关键字
  3. constexpr 关键字
  4. 常量指针与指针常量
  5. 常量的初始化
  6. 常量表达式
  7. 常量与引用
  8. 参考资料

1. 常量概述

常量是值不可修改的变量,在程序运行过程中其值保持不变。常量可以是数字、字符、字符串等类型的值,它们在声明时就被赋予了一个固定的值,之后无法修改。常量的使用有助于提升代码的可读性、维护性并避免错误。


2. const 关键字

在 C++ 中,const 用于定义常量。const 使得指定变量变为只读,禁止修改该变量的值。

2.1 常量的定义

const int MAX_SIZE = 100;  // 定义一个常量 MAX_SIZE,其值为 100

2.2 常量作为函数参数

使用 const 修饰函数参数,可以避免函数修改该参数的值。

void printValue(const int value) {
    std::cout << "Value is: " << value << std::endl;
    // value = 200;  // ❌ 错误,不能修改常量值
}

2.3 常量与类成员

在类成员函数中,const 可以用来修饰函数,保证该函数不会修改类成员变量。

class MyClass {
public:
    void printValue() const {  // const 成员函数,不能修改成员变量
        std::cout << "This is a constant member function." << std::endl;
    }
};


3. constexpr 关键字

constexpr 是 C++11 引入的关键字,用于声明常量表达式,这些常量必须在编译时就能求值。它比 const 更严格,因为 constexpr 确保变量的值在编译时就已确定,而 const 则允许在运行时初始化。

3.1 constexpr 定义常量

constexpr int MAX_ARRAY_SIZE = 200;  // 编译时已知的常量

3.2 constexpr 函数

constexpr 也可以用来修饰函数,确保该函数在编译时能够执行,并且返回值是常量。

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

int main() {
    int result = square(5);  // 编译时已计算结果
    std::cout << "Square of 5 is: " << result << std::endl;
    return 0;
}

⚠️ 注意constexpr 函数中的所有表达式必须是常量,可以在编译时求值。


4. 常量指针与指针常量

指针常量与常量指针是常见的概念,它们帮助我们控制对内存地址的访问。

4.1 常量指针(Pointer to Constant)

常量指针是指向常量的指针,意味着指针指向的值不能被修改

int a = 10;
const int *ptr = &a;
*ptr = 20;  // ❌ 错误,不能修改常量值

4.2 指针常量(Constant Pointer)

指针常量是指针本身不能被改变,但指向的值可以修改。

int a = 10;
int b = 20;
int* const ptr = &a;  // ptr 本身是常量,不能指向其他变量
*ptr = 30;  // 可以修改 ptr 指向的值

4.3 常量指针常量(Constant Pointer to Constant)

这是一种更严格的情况,既指针不能改变指向的值也不能改变

int a = 10;
const int* const ptr = &a;  // ptr 和 ptr 指向的值都不能修改


5. 常量的初始化

常量的初始化要求在声明时赋值,不能在之后更改。常量可以通过两种方式初始化:

  1. 直接初始化:通过等号 = 进行赋值。
  2. 括号初始化:使用括号 () 来进行初始化。

示例

const int MAX = 50;       // 直接初始化
constexpr double PI = 3.14;  // `constexpr` 常量初始化


6. 常量表达式

常量表达式是指在编译时能够计算得出的值。constexpr 可以用于常量表达式的定义,而 const 用于在运行时确定的常量。

6.1 constexpr 常量表达式

constexpr 保证表达式在编译时求值,这意味着常量的值必须在编译阶段已知。

constexpr int getSize() {
    return 50;  // 编译时已确定
}

int array[getSize()];  // 可以用 `constexpr` 表达式定义数组大小


7. 常量与引用

在 C++ 中,常量引用通常用于确保对对象的访问是只读的,且避免不必要的对象拷贝。

7.1 常量引用(const 引用)

常量引用允许通过引用访问常量,而不允许修改其值。

int x = 10;
const int &ref = x;  // 常量引用,不允许修改 x 的值
// ref = 20;  // ❌ 错误,不能通过常量引用修改值

7.2 常量引用与大型数据类型

使用常量引用能够避免对大型对象(如大型数组或结构体)的拷贝,提高程序性能。

struct LargeObject {
    int data[10000];
};

void processData(const LargeObject& obj) {
    // obj.data 不会被修改
}


8. 参考资料


总结

常量在 C++ 中具有以下特点:

  1. const 关键字:定义常量变量,无法修改其值。
  2. constexpr 关键字:定义常量表达式,要求在编译时已知,严格要求常量值不可变。
  3. 常量指针与指针常量:常量指针(指向常量的指针)与指针常量(指针本身不可改变)具有不同的用途。
  4. 常量引用:允许通过引用访问常量而不修改其值,特别适用于大型对象的传递。

合理使用常量能够提升代码的可靠性、可维护性,并避免意外的修改或错误!🚀