第5.10章: const 与指针
概述
指针与 const 的交互有三种不同的方式。理解
这些组合对于编写正确且安全的 C++ 代码至关重要。
在本章中,你将学到:
- 规则:
const作用于左边。就这样。 - 如何解读
T const*、T* const与T const* const - “指向 const 的指针”与“const 指针”的区别
- 为什么
char const*是 C 风格字符串的正确类型 - const 如何与指针算术交互
1. 规则:const 作用于左边。就这样。
这条规则在第2.8章中介绍过,也是解读所有 const 指针类型的基础:
如果 const 左边有类型,它就作用于该类型。
如果没有,它就作用于右边。
示例:
int const x = 5; // const applies to int
const int y = 6; // same meaning, but less clear
对指针而言,这条规则变得极其重要。
2. 指向 const 的指针:T const*
这表示“指向 const T 的指针”。 指针可以改变,但它所指的对象不可以。
int value{10};
int const *p = ::std::addressof(value); // pointer to const int
允许:
p = ::std::addressof(value); // ✔ pointer may change
不允许:
// *p = 20; // ❌ cannot modify through pointer
这是指向 C 风格字符串的指针的正确类型:
char const *s = "Hello"; // correct
请始终写 T const*,而不是 const T*。
3. const 指针:T* const
这表示“指向 T 的 const 指针”。 指针不可以改变,但它所指的对象可以。
int value{10};
int * const p = ::std::addressof(value); // const pointer
允许:
*p = 20; // ✔ can modify the pointee
不允许:
// p = nullptr; // ❌ pointer itself is const
4. 指向 const 的 const 指针:T const* const
这表示:
- 指针本身不能改变
- 所指的对象也不能改变
int value{10};
int const * const p = ::std::addressof(value);
不允许:
// p = nullptr; // ❌ pointer is const
// *p = 20; // ❌ pointee is const
5. 为什么 char const* 是 C 风格字符串的正确类型
字符串字面量是常量 C 风格数组。 它不能被修改。
char const *s = "Hello"; // correct
写 char const* 让 const 性明确,并遵循规则:
const 作用于左边。就这样。
写 const char* 是允许的,但与该规则不太一致。
6. const 与指针算术
const 不影响指针算术。 它只影响什么可以被修改。
int a[3]{1,2,3};
int const *p = a; // pointer to const int
p = p + 1; // ✔ pointer may move
但你仍然不能修改所指对象:
// *p = 10; // ❌ not allowed
对 const 指针而言:
int * const q = a; // const pointer
// q = q + 1; // ❌ cannot move pointer
*q = 10; // ✔ can modify pointee
7. 汇总表
| 语法 | 含义 | 指针可以改变? | 所指对象可以改变? |
|---|---|---|---|
T const* |
指向 const T 的指针 | ✔ 可以 | ❌ 不可以 |
T* const |
指向 T 的 const 指针 | ❌ 不可以 | ✔ 可以 |
T const* const |
指向 const T 的 const 指针 | ❌ 不可以 | ❌ 不可以 |
要点
const作用于左边。就这样。- 请始终写
T const*,而不是const T*。 T const*表示“指向 const T 的指针”。T* const表示“指向 T 的 const 指针”。T const* const表示“指向 const T 的 const 指针”。char const*是 C 风格字符串的正确类型。- const 不影响指针算术。
- const 只影响什么可以被修改。