C/C++中关键字const

C/C++中关键字const

一、const是什么

const 是 C/C++ 里的“常量修饰符”,用来声明“只读”的变量或对象。打个比方:你给变量上了“警示标签”,告诉编译器和程序员“这个东西不准改”。

二、const的作用

  1. 保护数据:把变量设为只读,防止被意外修改。
  2. 节省空间:编译器可以把常量直接放在符号表里,不一定要给它留内存。
  3. 提高效率:访问常量时,不用读写内存,直接把值“灌”进机器指令里。

三、const的九种常见用法

1. const 变量

  • 特性:声明时必须初始化,以后不能改。
  • 示例
    const int maxUsers = 100;
    // maxUsers = 50;    // 错误:只读变量不能赋值
    // const int x;      // 错误:const 变量未初始化
    

2. const 全局替代宏

  • const 替代 #define,好处是:
    • 带类型检查
    • 作用域更清晰
  • 示例
    const double PI = 3.1415926;
    

3. const 结构体

  • 把整个结构体当只读用,成员都不能改。
  • 示例
    struct Point { int x, y; };
    const struct Point p = {10, 20};
    // p.x = 5;   // 错误:结构体成员不可修改
    

4. const 类对象

  • 对象的方法里加 const 的是只读版,不能改成员,也不能调用非 const 方法。
  • 示例
    class Logger {
    public:
        Logger(int lvl): level(lvl) {}
        void show() const { std::cout << level; }
        void set(int lvl) { level = lvl; }
    private:
        int level;
    };
    const Logger log(2);
    log.show();         // ✅ 可以
    // log.set(3);      // ❌ 错误:非 const 方法不能调用
    

5. 指向 const 的指针

  • 指针类型const int *p —— 通过 p 不能改它指向的值,但 p 自己可以指向别的地方。
  • 示例
    int a = 1, b = 2;
    const int *p = &a;
    // *p = 3;  // ❌ 错误
    p = &b;    // ✅ 合法
    

6. const 指针

  • 指针本身不能改指向,写法 int * const p,但它能修改指向的数据。
  • 示例
    int x = 5, y = 6;
    int * const p = &x;
    *p = 10;   // ✅ 合法
    // p = &y;  // ❌ 错误:指针地址不可变
    

7. 指向 const 的 const 指针

  • 写法 const int * const p,既不能改指针,也不能改数据。
  • 示例
    int v = 42;
    const int * const p = &v;
    // *p = 7;  // ❌
    // p = &v;  // ❌
    

8. const 作为函数参数

  • 值传递void f(const int x) —— 函数内部不能改 x
  • 指针传递void f(const int *p) —— 不能通过 p 修改指向的内容。
  • 示例
    void printVal(const int n) {
        // n = 5;    // ❌ 错误
        printf("%d\n", n);
    }
    void modifyPtr(const int *p) {
        // *p = 5;   // ❌ 错误
    }
    void changePtr(int *p) {
        *p = 5;     // ✅ 合法
    }
    

9. const 返回值(引用)

  • 当函数返回引用时,加 const 可以防止外部修改它。
  • 示例
    const int& getMax() {
        static int best = 100;
        return best;
    }
    int main() {
        const int &r = getMax();
        // r = 200; // ❌ 错误
    }
    

10. const 成员变量 & 成员函数

  • 成员变量:必须在构造函数初始化列表里赋值。
    class Settings {
    public:
        Settings(int lvl): level(lvl) {}
    private:
        const int level;
    };
    
  • 成员函数:在方法后加 const,表示不会改成员数据。
    class Data {
    public:
        int get() const { return x; }
    private:
        int x = 0;
    };
    

小结

  • const 修饰的是“只读权”,不论是变量、指针还是对象,都把“改它”这件事锁死。
  • 指针相关的常见组合:
    • const T* p:指向 const,不可修改值;
    • T* const p:const 指针,不可修改指向;
    • const T* const p:两者都不可修改。
  • 把能锁死修改的地方都标成 const,既能提升程序安全性,也让编译器帮你做更多优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值