C++ 中 const 与复合类型:指针、引用及顶层/底层常量详解

星野
星野
发布时间:2026-10-13| 5人浏览过
原创

掌握 C++ const 是编写安全代码的关键。本文系统梳理了 const 在引用和复合类型(指针)中的行为差异,核心难点在于区分顶层 const(修饰指针本身)与底层 const(修饰指向的对象)。理解这一机制能有效避免编译器报错,并正确使用只读接口。

1. const 与引用的绑定规则

在 C++ 中,引用必须被初始化且不能重新绑定。当涉及 const 时,核心逻辑是保证通过引用无法修改所指对象的状态。

第1步:对常量的引用

如果绑定的是真正的常量,必须使用 const &。因为常量不可变,若允许普通引用,则可能通过引用意外修改原值,违反 const 语义。

const int ci = 1024;
const int &ri = ci; // ri 只能用于读取 ci

错误示例:int &rj = ci; 会导致编译错误,因为试图通过非 const 引用修改常量。

第2步:对变量的常引用(只读视图)

const & 不仅限于常量,它还可以绑定到变量上。这是一种常见的模式:将变量作为只读参数传递给函数或暴露给外部。

int i = 2048;
const int &ri = i; // ri 视为常量,但 i 本身仍是可变的

效果说明:

  • 通过 ri:不能赋值或修改。
  • 通过 i:仍然可以正常修改。

这为开放对象接口提供了一种保护机制:允许读取,但不允许通过引用篡改。此外,const & 还可以绑定到字面量和临时对象(表达式结果),而普通引用通常不能这样做。

int i = 5;
const int &ri1 = i;        // OK: 绑定到变量
const int &ri2 = 9;        // OK: 绑定到字面值
const int &ri3 = i * 2;    // OK: 绑定到临时量(右值)
int &r4 = i * 2;           // Error: 普通引用不能绑定到临时量

2. 指针与 const 的结合

与引用不同,指针是独立的对象,拥有自己的内存地址。因此,const 可以应用于指针本身,也可以应用于指针所指向的对象。这是 C++ const 最容易混淆的地方。

第3步:指向常量的指针(Pointer to Const)

语法重点: * 在 const 左侧(或在 const 右侧紧挨类型),表示指向的内容不可修改。

const int val = 5;
const int *pci = &val; // pci 指向一个常量

特点:

  • 解引用后不能修改值: *pci = 10; 是非法的。
  • 指针本身可以改变: pci = &other_val; 是合法的。
  • 既可以指向 const 变量,也可以指向普通变量(视为只读)。

第4步:常量指针(Const Pointer)

语法重点: const 在 * 的右侧,表示指针对象本身是常量,即地址一旦确定不可更改。

int var = 0;
int *const cpi = &var; // cpi 指向 var,且永远指向 var

特点:

  • 必须初始化:定义时必须赋予初值。
  • 不能修改指向: cpi = &other_var; 会报错。
  • 可以通过指针修改内容(除非内容也是 const): *cpi = 10; 合法。

第5步:指向常量的常量指针

结合上述两种情况,既不能修改指向的地址,也不能修改指向的内容。

const int *const cpci = &var; // 地址固定,内容只读

3. 核心概念:顶层 const 与底层 const

为了消除语法的歧义,C++ 标准引入了这两个概念来描述 const 的作用域。

第6步:识别顶层 const(Top-Level Const)

顶层 const 表示指针本身是一个常量。任何数据类型都可以具有顶层 const。

  • int *const p:指针 p 是顶层 const。
  • const int val:变量 val 是顶层 const(基本类型的常量默认都是顶层的)。

第7步:识别底层 const(Low-Level Const)

底层 const 表示指针所指的对象是常量。这涉及到指针、引用等复合类型。

  • const int *p:指针 p 指向的是底层 const。
  • const int &r:引用 r 是底层 const(注意:引用没有顶层 const,因为引用本身就是绑定,不可重定向)。

第8步:关键规则——底层 const 的拷贝限制

这是最容易踩坑的地方:

规则:可以将具有顶层 const 的对象赋值给另一个对象,但不能将底层 const 对象直接赋值给非底层 const 对象。

int i = 0;
const int *pc = &i; // pc 具有底层 const

int *p = pc;        // Error! 企图将底层 const 传给普通指针
                    // 这将失去只读保护,编译器不允许。

const int *new_pc = pc; // OK: 底层对底层
int const_val = 5;       // OK: 顶层对顶层(基本类型)

总结

在阅读 const 相关声明时,建议从左向右读,或者根据星号 * 的位置判断:

  • const Type *ptr:const 靠近类型,修饰的是对象(底层 const),内容不可改。
  • Type *const ptr:const 靠近指针名,修饰的是指针(顶层 const),地址不可改。

理解这些区别能帮助你写出更符合 C++ 安全规范、不易出错的代码,特别是在设计只读接口或防止意外修改数据时。

以上就是C++中const与复合类型详细内容的介绍,更多关于C++基础知识的学习资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。