详细讲解常量

在 C++ 中,**常量(Constant)**是指在程序运行期间其值不会改变的变量或数据。常量可以通过 const 关键字、constexpr 关键字、#define 预处理指令等方式来定义。以下是 C++ 中常量的详细讲解。


1. 使用 const 关键字定义常量

1.1 基本 const 变量

const 关键字用于声明不可修改的变量。例如:

#include <iostream>
using namespace std;

int main() {
    const int a = 10;
    // a = 20; // 错误,常量不能被修改
    cout << "a = " << a << endl;
    return 0;
}

特点:

  • const 变量在定义时必须初始化,否则会报错。
  • const 变量的值在整个程序运行期间不能被修改。

1.2 const 指针

在 C++ 中,const 可以用于指针,有多种不同的用法:

#include <iostream>
using namespace std;

int main() {
    int x = 10;
    int y = 20;

    // 1. 指向常量的指针(指针指向的值不能修改)
    const int *p1 = &x;
    // *p1 = 20; // 错误
    p1 = &y; // 正确,指针本身可以改变指向

    // 2. 常量指针(指针本身不能修改,但指向的值可以改)
    int *const p2 = &x;
    *p2 = 20; // 正确,修改指向的值
    // p2 = &y; // 错误,指针本身不能修改

    // 3. 指向常量的常量指针(指针和指向的值都不可修改)
    const int *const p3 = &x;
    // *p3 = 20; // 错误
    // p3 = &y; // 错误

    return 0;
}

1.3 const 修饰函数参数

const 关键字可以用于修饰函数的参数,以防止参数在函数内部被修改:

#include <iostream>
using namespace std;

void printValue(const int value) {
    // value = 20; // 错误,不能修改常量参数
    cout << "Value: " << value << endl;
}

int main() {
    int num = 10;
    printValue(num);
    return 0;
}

如果参数是指针或引用,const 可以防止修改指向的对象:

void printArray(const int *arr, int size) {
    // arr[0] = 100; // 错误,不能修改
    for (int i = 0; i < size; ++i) {
        cout << arr[i] << " ";
    }
}

1.4 const 修饰类的成员函数

const 修饰类的成员函数时,表示该函数不会修改类的成员变量:

class Test {
private:
    int value;
public:
    Test(int v) : value(v) {}
    void show() const {  // const 成员函数
        // value = 20; // 错误,不能修改成员变量
        cout << "Value: " << value << endl;
    }
};

2. 使用 constexpr 关键字

2.1 constexpr 介绍

C++11 引入了 constexpr 关键字,表示编译期常量,即它的值在编译时就已经确定。

#include <iostream>
using namespace std;

constexpr int getValue() { return 10; }

int main() {
    constexpr int x = getValue(); // 在编译时求值
    cout << "x = " << x << endl;
    return 0;
}

区别:

  • const 变量的值可以在运行时确定。
  • constexpr 变量的值必须在编译时确定。

3. 使用 #define 预处理指令

#define 可以用于定义常量,但它不是类型安全的:

#define PI 3.14159
#define SQUARE(x) ((x) * (x))

int main() {
    cout << "PI = " << PI << endl;
    cout << "SQUARE(5) = " << SQUARE(5) << endl;
    return 0;
}

缺点:

  • #define 不能用于类型检查。
  • #define 不能用于类的成员变量。

4. enum 枚举常量

enum 也可以用于定义一组常量:

enum Color { RED, GREEN, BLUE };

int main() {
    Color c = RED;
    cout << "Color value: " << c << endl; // 输出 0(枚举的默认值)
    return 0;
}

5. const vs constexpr vs #define

方式是否类型安全是否可用于类成员何时求值
const运行时或编译时
constexpr编译时
#define预处理阶段

6. 总结

  • const 适用于大多数情况下的常量定义,能保证类型安全。
  • constexpr 适用于编译期常量,性能更高,但要求值在编译期确定。
  • #define 适用于简单的宏替换,但不推荐用于常量定义。
  • enum 适用于定义整数型的常量集合。

这样,在 C++ 中使用常量时,可以根据实际情况选择合适的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值