顶层 const 和底层 const 的区别,核心在于这个 const 修饰的是"对象本身",还是"对象所指/所引用的那个东西"。
顶层 const(top-level const)
const 修饰的是变量本身,表示这个对象自己不能被修改。
cpp
const int a = 1; // a 本身是 const,顶层 const
int* const p = &n; // p 这个指针本身是 const(不能改指向),顶层 const
const int b = 2; // b 本身是 const,顶层 const
对指针来说:
-
int* const p:p不能改指向,但*p可以改 → 顶层 const。 -
const int* p:p可以改指向,但*p不能改 → 这是底层 const,见下。
底层 const(low-level const)
const 修饰的是指针/引用所指向的那个对象,表示通过这个指针/引用不能修改目标。
cpp
const int* p = &n; // 指向 const int,*p 不能改,底层 const
const int& r = n; // 引用 const int,通过 r 不能改,底层 const
int const* q = &n; // 同上,底层 const
指针的经典记法:const 在 * 左边 → 底层 const(指向的东西是 const);const 在 * 右边 → 顶层 const(指针自己是 const)。
cpp
const int* p1; // 底层 const:*p1 不能改
int* const p2; // 顶层 const:p2 不能改
const int* const p3; // 两者都有:p3 和 *p3 都不能改