跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++

C++ const 完整语法整理

C++ const 关键字用于定义只读约束,在编译期检查修改行为以提升安全性。文章涵盖 const 修饰普通变量、指针、引用、函数参数及返回值、类成员变量和成员函数的完整语法。重点解析指针 const 的左右位置含义、const 引用绑定临时值的生命周期延长机制、const 成员函数对 this 指针的限制以及 mutable 关键字的例外情况。同时提供常量正确性规范建议,帮助开发者编写更安全高效的 C++ 代码。

星河入梦发布于 2026/3/16更新于 2026/5/113 浏览

C++ const 完整语法整理

const 是 C++ 核心的类型限定符,核心作用是给数据 / 函数添加'只读'约束,编译阶段强制检查修改行为,既提升代码安全性、可读性,也帮助编译器做优化。以下按「使用场景」拆解 const 的语法、作用和核心规则,覆盖从基础到类成员的全场景。

一、核心定义

const(常量)本质是'只读契约':

  • 编译期检查:禁止修改被 const 修饰的内容,违规直接报编译错误;
  • 无运行期开销:仅在编译阶段生效,不额外占用内存(除非对 const 变量取地址 / 声明为全局 / 静态);
  • 核心价值:避免意外篡改数据、明确函数'只读行为'、支持 const 对象调用。

二、分场景语法详解

场景 1:const 修饰普通变量(全局 / 局部)
语法(两种等价写法)
// 写法 1:const 在前(推荐,语义更清晰)
const 类型 变量名 = 初始值;
// 写法 2:const 在后(效果一致,顺序不影响)
类型 const 变量名 = 初始值;
核心作用

变量一旦初始化,终身不可修改;且 const 变量必须初始化(否则编译报错)。

示例
// 局部 const 变量(栈上)
const double PI = 3.14159;
// PI = 3.14; // 错误:只读变量不可赋值
int const num = 10; // 等价于 const int num

// 全局 const 变量(全局区,默认作用域为当前文件)
const int GLOBAL_NUM = 100;

// 跨文件访问全局 const:加 extern
extern const int GLOBAL_NUM2 = 200;
注意事项
  • 局部 const 变量:若用字面量初始化(如 3.14),编译器可能'常量折叠'(直接替换值,不访问内存);
  • 全局 const 变量:默认带 static 属性(仅当前文件可见),跨文件访问需加 extern。
场景 2:const 修饰指针(重点!三种核心场景)

核心口诀:左数右指

  • const 在 * 左边 → 修饰「指针指向的内容」(数据只读,指针可移动);
  • const 在 * 右边 → 修饰「指针本身」(指针地址只读,指向的内容可改);
场景语法核心约束示例
数据只读,指针可移const 类型* 指针名不能改 *指针名,可改 指针名const int* p = &a; // *p=20 错,p=&b 对
指针只读,数据可改类型* const 指针名必须初始化,可改 *指针名,不能改 指针名int* const p = &a; // *p=20 对,p=&b 错
数据 + 指针都只读const 类型* const 指针名都不可改,必须初始化const int* const p = &a; // 全只读
示例
int a = 10, b = 20;

// 场景 1:数据只读,指针可移
const int* p1 = &a;
// *p1 = 30; // 错误:内容只读
p1 = &b; // 正确:指针可移动

// 场景 2:指针只读,数据可改
int* const p2 = &a;
*p2 = 30; // 正确:内容可改
// p2 = &b; // 错误:指针地址只读

// 场景 3:全只读
const int* const p3 = &a;
// *p3 = 30; // 错误
// p3 = &b; // 错误
场景 3:const 修饰引用(const 引用)
语法
const 类型& 引用名 = 变量/常量/临时值;
核心作用
  1. 禁止通过引用修改原变量(引用只读);
  2. 可绑定常量 / 临时值(普通引用只能绑定可修改的左值);
  3. 绑定临时值时,临时值的生命周期会被延长至引用的生命周期结束。
示例
int a = 10;
const int& ref1 = a; // ref1 = 20; // 错误:引用只读
const int& ref2 = 100; // 正确:const 引用可绑定常量
double b = 3.14;
const int& ref3 = b; // 正确:临时值(int(b))绑定到 const 引用,生命周期延长
典型用途

函数参数传递(避免拷贝 + 防止修改):

// 自定义类型参数:const& 避免拷贝,且禁止修改参数
void printCircle(const Circle& c) {
    cout << c.calculateArea() << endl; // 只能调用 c 的 const 成员函数
}
场景 4:const 修饰函数参数
语法
// 基础类型(传值,const 仅约束函数内)
void func(const int num) { /* num 不可改 */ }

// 自定义类型(推荐 const&,避免拷贝 + 防修改)
void func(const Circle& c) { /* c 不可改 */ }

// 指针参数(const 修饰指向的内容)
void func(const int* p) { /* *p 不可改 */ }
核心作用
  • 禁止函数内修改参数值,提升代码安全性;
  • 对自定义类型(如 Circle),结合引用(const&)可避免拷贝,大幅提升效率;
  • 基础类型(int/double)传值时加 const,仅约束函数内,对外部无影响(可加可不加)。
场景 5:const 修饰函数返回值
语法与作用

仅对「指针 / 引用返回值」有实际意义(基础类型返回值是拷贝,const 无作用):

// 场景 1:返回 const 指针(禁止修改返回的内容)
const int* func1(int* arr) {
    return arr;
}

// 场景 2:返回 const 引用(禁止外部修改类成员)
class Circle {
private:
    double radius;
public:
    const double& getRadius() const {
        return radius;
    }
};
示例
int arr[] = {1, 2, 3};
const int* p = func1(arr);
// *p = 10; // 错误:返回的指针指向内容只读

Circle c(5.0);
// c.getRadius() = 10; // 错误:返回的引用只读
场景 6:const 修饰类成员(核心!分变量 + 函数)
子场景 6.1:const 成员变量(类内常量)
语法(两种初始化方式)
  • C++11 及以上:类内直接初始化(简洁);
  • 所有 C++ 版本:构造函数初始化列表初始化(兼容推荐)。
// 写法 1:C++11+ 类内直接初始化
class Circle {
private:
    const double PI = 3.14159; // 类内初始化 const 成员
    double radius;
public:
    Circle(double r) : radius(r) {}
};

// 写法 2:初始化列表初始化(兼容所有版本)
class Circle {
private:
    const double PI; // 仅声明,不赋值
    double radius;
public:
    // 必须在初始化列表初始化 const 成员(不能在构造函数体赋值)
    Circle(double r) : PI(3.14159), radius(r) {}
};
关键补充:静态 const 成员变量

若常量是所有对象共享的(如 PI),加 static 修饰,减少内存开销(所有对象共用一份):

class Circle {
private:
    static const double PI = 3.14159; // 静态常量,类内初始化
    double radius;
};

// (可选)类外定义(若需跨文件访问)
const double Circle::PI = 3.14159;
子场景 6.2:const 成员函数(常量成员函数)
语法
返回值 函数名 (参数列表) const;
// const 在参数列表后
核心作用
  1. 约束函数不修改对象状态:this 指针变为 const 类名*(只读指针),不能修改类的非 mutable 成员变量;
  2. 支持 const 对象调用:const 对象只能调用 const 成员函数(非 const 对象可调用 const / 非 const 函数);
  3. 语义标注:明确函数是'只读操作',提升可读性。
示例(Circle 类)
class Circle {
private:
    double radius;
    mutable int calcCount = 0; // mutable:const 函数中可修改
public:
    double calculateArea() const {
        // const 成员函数
        calcCount++; // 合法:mutable 变量不受 const 约束
        // radius = 10; // 错误:不能修改非 mutable 成员
        return PI * radius * radius;
    }
    void setRadius(double r) {
        // 非 const 成员函数
        radius = r;
    }
};

// 使用场景
const Circle c1(5.0);
c1.calculateArea(); // 正确:const 对象调用 const 函数
// c1.setRadius(6.0); // 错误:const 对象不能调用非 const 函数

Circle c2(5.0);
c2.calculateArea(); // 正确:非 const 对象可调用 const 函数
c2.setRadius(6.0); // 正确:非 const 对象调用非 const 函数
补充:mutable 关键字(const 函数的例外)

mutable 修饰的成员变量,可突破 const 函数的约束(用于统计、缓存等不影响对象核心状态的场景):

class Circle {
private:
    mutable int calcCount = 0; // 可在 const 函数中修改
public:
    double calculateArea() const {
        calcCount++; // 合法:统计函数调用次数
        return PI * radius * radius;
    }
};
场景 7:const 修饰对象(const 对象)
语法
const 类名 对象名 (构造参数);
核心作用

对象只读:只能调用 const 成员函数,不能修改任何成员变量(包括非 const 成员)。

示例
const Circle c(5.0);
// c.setRadius(6.0); // 错误:const 对象不能调用非 const 函数
cout << c.calculateArea() << endl; // 正确:调用 const 函数

三、核心规则与易错点

  1. const 是编译期约束:仅在编译阶段检查,若通过 const_cast 强制修改 const 变量,会导致'未定义行为'(可能崩溃 / 数据异常);
  2. const 的顺序:
    • 普通变量:const int a 和 int const a 等价;
    • 指针:const int* p 和 int const* p 等价(左数),int* const p(右指)不同;
  3. const 引用绑定临时值:临时值(如 10、表达式结果)的生命周期会被 const 引用延长至引用生命周期结束;
  4. const 成员函数调用规则:
    • const 成员函数 → 只能调用其他 const 成员函数(避免间接修改对象);
    • 非 const 成员函数 → 可调用 const / 非 const 成员函数。
const int num = 10;
int* p = const_cast<int*>(&num);
*p = 20; // 未定义行为!编译器可能优化 num 为常量折叠,num 仍为 10

四、常量正确性(Const Correctness)规范

遵循以下规范,可大幅减少编程错误:

  1. 所有只读数据(如 PI)用 const 修饰;
  2. 所有不修改对象状态的成员函数加 const;
  3. 函数参数若无需修改,加 const(尤其是自定义类型的引用 / 指针参数);
  4. const 对象仅调用 const 成员函数,非 const 对象按需调用;
  5. 静态常量成员加 static const,减少内存开销。

总结

目录

  1. C++ const 完整语法整理
  2. 一、核心定义
  3. 二、分场景语法详解
  4. 场景 1:const 修饰普通变量(全局 / 局部)
  5. 语法(两种等价写法)
  6. 核心作用
  7. 示例
  8. 注意事项
  9. 场景 2:const 修饰指针(重点!三种核心场景)
  10. 示例
  11. 场景 3:const 修饰引用(const 引用)
  12. 语法
  13. 核心作用
  14. 示例
  15. 典型用途
  16. 场景 4:const 修饰函数参数
  17. 语法
  18. 核心作用
  19. 场景 5:const 修饰函数返回值
  20. 语法与作用
  21. 示例
  22. 场景 6:const 修饰类成员(核心!分变量 + 函数)
  23. 子场景 6.1:const 成员变量(类内常量)
  24. 语法(两种初始化方式)
  25. 关键补充:静态 const 成员变量
  26. 子场景 6.2:const 成员函数(常量成员函数)
  27. 语法
  28. 核心作用
  29. 示例(Circle 类)
  30. 补充:mutable 关键字(const 函数的例外)
  31. 场景 7:const 修饰对象(const 对象)
  32. 语法
  33. 核心作用
  34. 示例
  35. 三、核心规则与易错点
  36. 四、常量正确性(Const Correctness)规范
  37. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2024 前端主流框架演进与性能优化实践总结
  • GitHub 7 大 Claude Skills 开源项目:Skill Creator、Superpowers 与 Code Review 实战指南
  • Stable Diffusion 常用模型详解:Checkpoint、LoRA 与 ControlNet 等
  • Python 入门基础知识:新手必备核心类型与内置方法
  • AI 技术在游戏开发与内容创作中的应用实践
  • Spring Boot 安全认证与授权详解
  • 基于大模型构建个性化新闻助手
  • Stable Diffusion v1.5 Archive 跨平台效果一致性复现指南
  • KingbaseES 数据库 MySQL 迁移零改造核心技术与实践
  • 基于 Rokid 灵珠平台搭建旅游 AR 智能体指南
  • IDEA 集成 AI 辅助工具推荐:高效不卡顿
  • 二分查找算法进阶:山脉数组与旋转排序
  • OpenClaw 本地部署全自动制作 AI 漫剧教程
  • 基于中间件与多模态模型的 AI Agent 自动化架构实战
  • Linux 编译器 GCC/G++ 深度解析
  • 商汤开源 SenseNova-MARS 模型:实现多模态搜索推理新突破
  • Python 基础语法详解:从数据类型到序列操作
  • IDEA 集成通义千问插件的 Java 开发实战
  • Copilot 代理配置与网络优化实战指南
  • SpringBoot 整合 Neo4j 图数据库实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online