c++ 中的关键字 const含义详解

 更新时间:2025年11月24日 09:27:23   作者:赫尔·普莱蒂科萨·帕塔  
C++ 中的 const 关键字是一个强大的工具,主要用于定义“只读”变量或对象,告诉编译器和程序员,被其修饰的内容不应被改变,本文给大家介绍c++ 中的关键字 const含义,感兴趣的朋友跟随小编一起看看吧

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* 左边,限定的是指针指向的数据;在 * 右边,限定的是指针本身):

  • 指向常量的指针(常量指针)
  • 声明方式: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
  • 指针常量
  • 声明方式:int *const p = &a; // 注意:这种形式必须在声明时初始化
  • 这表示指针本身是常量,一旦初始化指向某个地址后,就不能再指向其他地址。但可以通过这个指针修改它所指向的数据
int a = 10, b = 20;
int *const p = &a; // p 将始终指向 a
*p = 15;           // 正确!可以通过 p 将 a 的值改为 15
// p = &b;        // 错误!指针 p 本身不能改变指向
  • 指向常量的指针常量
  • 声明方式: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),通常直接使用值传递即可,因为复制开销很小。
  • 修饰类成员函数
    • 在成员函数声明的最后加上 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 对象可以调用所有成员函数。

  • 修饰函数返回值
    • 当函数返回一个指针或引用时,用 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 生成)

到此这篇关于c++ 中的关键字 const含义详解的文章就介绍到这了,更多相关c++ 关键字 const内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# Chart控件标记问题详解

    C# Chart控件标记问题详解

    这篇文章主要介绍了C# Chart控件标记问题详解,在做项目的时候,遇到一个需求,需要我对Chart图标标记数据正在运行,实现数据可视化,文章通过围绕主题展开详情,需要的朋友可以参考一下
    2022-08-08
  • 利用C#实现最基本的小说爬虫示例代码

    利用C#实现最基本的小说爬虫示例代码

    最近在学习c#,碰巧遇到个小说站不错,就索性当个练习,所以这篇文章主要给大家介绍了关于利用C#实现最基本的小说爬虫的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • Log4Net 日志配置[附带源码下载]

    Log4Net 日志配置[附带源码下载]

    这篇文章主要介绍了Log4Net 日志配置[附带源码下载],需要的朋友可以参考下
    2015-05-05
  • 在C#中根据HardwareID获取驱动程序信息的实现代码

    在C#中根据HardwareID获取驱动程序信息的实现代码

    这篇文章主要介绍了C#中根据HardwareID获取驱动程序信息的实现代码,需要的朋友可以参考下
    2016-12-12
  • WPF实现绘制饼状统计图的示例代码

    WPF实现绘制饼状统计图的示例代码

    这篇文章主要为大家详细介绍了如何使用WPF实现绘制简单的饼状统计图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • 详解C#切换窗口

    详解C#切换窗口

    最近项目不多忙,于是抽点时间巩固下切换窗口问题,感兴趣的朋友跟着小编一起学习吧
    2016-04-04
  • C#如何实现用户名与密码登录

    C#如何实现用户名与密码登录

    这篇文章主要介绍了C#如何实现用户名与密码登录问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • c#中token的使用方法实例

    c#中token的使用方法实例

    本文主要介绍了c#中token的使用方法实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#使用Spire.XLS快速生成多表格Excel文件

    C#使用Spire.XLS快速生成多表格Excel文件

    在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#代码就能快速生成包含多个工作表的专业级Excel文档,让繁琐的数据导出工作变得轻松高效,需要的朋友可以参考下
    2025-08-08
  • C#数据结构与算法揭秘五 栈和队列

    C#数据结构与算法揭秘五 栈和队列

    这节我们讨论了两种好玩的数据结构,栈和队列
    2012-11-11

最新评论