c++ 中的关键字 const 是什么意思?

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

c++ 中的关键字 const 是什么意思?

C++ 中的 const 关键字是一个强大的工具,主要用于定义“只读”变量或对象,告诉编译器和程序员,被其修饰的内容不应被改变。它的核心价值在于增强代码的健壮性和安全性,防止数据被意外修改,同时有时也能帮助编译器进行优化。

下面这个表格汇总了 const 关键的主要应用场景和核心含义,方便你快速了解:

应用场景核心含义代码示例
修饰普通变量变量值在初始化后不可更改,必须在定义时初始化。const int maxSize = 100;
修饰指针情况多样,取决于 const* 号前还是后,具体见下文详解。const int *p; / int *const p;
修饰函数参数函数内部不能修改该参数的值,常用于指针或引用参数以保护原始数据。void func(const MyClass& obj);
修饰类成员函数该成员函数承诺不会修改类的任何非 mutable 成员变量。int getValue() const;
修饰函数返回值函数的返回值(通常是指针或引用)不能被修改。const char* getString();

在这里插入图片描述

💁 理解指针与 const 的搭配

const 与指针的结合是理解的关键和难点,主要有三种情况,可以借助“左定值,右定向”的口诀来记忆(const* 左边,限定的是指针指向的数据;在 * 右边,限定的是指针本身):

  1. 指向常量的指针(常量指针)
    声明方式:const int *p;int const *p;
    这表示指针指向的数据是常量,不能通过这个指针来修改该数据。但指针本身可以指向别的地址

    int a = 10, b = 20;
    const int *p = &a; // p 指向 a
    // *p = 15; // 错误!不能通过 p 修改 a 的值
    p = &b;     // 正确!指针 p 可以改为指向 b
    cout << *p; // 正确,输出 20
    
  2. 指针常量
    声明方式:int *const p = &a; // 注意:这种形式必须在声明时初始化
    这表示指针本身是常量,一旦初始化指向某个地址后,就不能再指向其他地址。但可以通过这个指针修改它所指向的数据

    int a = 10, b = 20;
    int *const p = &a; // p 将始终指向 a
    *p = 15;           // 正确!可以通过 p 将 a 的值改为 15
    // p = &b;        // 错误!指针 p 本身不能改变指向
    
  3. 指向常量的指针常量
    声明方式:const int *const p = &a;
    这是最严格的形式,意味着指针本身不能改变指向,同时也不能通过它修改指向的数据

    int a = 10;
    const int *const p = &a;
    // *p = 15; // 错误!不能通过 p 修改 a
    // p = &someOtherVar; // 错误!p 不能指向别处
    

🔧 其他重要应用场景

  1. 修饰函数参数
    将函数参数声明为常量引用(如 void func(const MyClass& obj))是一种非常常见且推荐的做法。这样做有两个主要好处:

    • 安全:保证函数内部不会意外修改原始对象的值。
    • 高效:对于自定义类型(如类、结构体),避免了值传递时整个对象的复制开销,效率远高于值传递(void func(MyClass obj))。
      对于内置基本类型(如 int, double),通常直接使用值传递即可,因为复制开销很小。
  2. 修饰类成员函数
    在成员函数声明的最后加上 const,表示这个函数不会修改该对象的任何成员变量(除非成员变量被 mutable 关键字修饰)。

    class Counter {
    public:
        int getCount() const { // 承诺不修改成员变量
            // value++; // 错误!const 成员函数内不能修改非 mutable 成员
            return value;
        }
        void increment() { // 非 const 成员函数,可以修改
            value++;
        }
    private:
        int value = 0;
        mutable int accessTimes = 0; // mutable 成员,即使在 const 函数中也可被修改
    };
    

    规则const 对象(如 const Counter c;)只能调用其 const 成员函数,而非 const 对象可以调用所有成员函数。

  3. 修饰函数返回值
    当函数返回一个指针或引用时,用 const 修饰可以防止返回的值被用作左值(即被赋值)。

    const char* getGreeting() {
        return "Hello, World!";
    }
    // getGreeting()[0] = 'h'; // 错误!尝试修改常量数据
    

💎 顶层 const 与底层 const

这是一个有助于你更精确理解 const 属性的概念:

  • 顶层 const:表示变量(或指针)本身是个常量。例如 int *const p 中的 const 是顶层 const。
  • 底层 const:表示指针或引用所指向的对象是一个常量。例如 const int *p 中的 const 是底层 const。

💡 使用 const 的好处

  • 增强代码可读性:看到 const,你就知道这个值不应该被改变,代码意图更清晰。
  • 提高程序健壮性:编译器会帮你检查是否有违反 const 约束的修改操作,将许多潜在错误扼杀在编译阶段。
  • 帮助编译器优化:编译器知道某些值不变后,可能进行更积极的优化。

⚠️ 注意 const 的局限性

需要注意的是,const 主要提供的是编译期的保护。它并不能绝对阻止在运行时通过某些方式(如强制类型转换或直接操作内存)修改被定义为常量的数据,但这类操作通常是危险且不推荐的。

希望这些解释能帮助你透彻理解 C++ 中的 const 关键字。它是一个非常强大的助手,善用它可以写出更安全、更清晰的代码。

(注:文档部分内容可能由 AI 生成)

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值