MirrorYuChen
MirrorYuChen
Published on 2025-02-02 / 15 Visits
0
0

C++中 `const`限定学习笔记

C++中 const限定学习笔记

1.const语义

​ 在C++中,const用于修饰变量或对象,表示其不可被修改。根据 const修饰的对象和位置,可以分为底层 const和顶层 const

1.1 底层 const

​ 底层 const是指修饰对象内容不可变。它常用于修饰变量、成员变量或对象的内部数据。

const int a = 10;   // a是底层const,表示a的值不可修改
int *ptr = &a;      // 错误,不能将底层const地址赋值给非const指针
const int *ptr1 = &a; // 正确,ptr1是指向底层const的指针

​ 这里其实很好理解,a是底层 const修饰,表示 a的值不可被修改,int *ptr = &a;就是将 a的地址给 ptr,若这句正确,则表明我们可以修改 ptr指向地址内容,也即是说,我们能修改 a的值,这和 const int a = 10;的意图相违背,所以这句会报错。下面这句成立的原因与之相同。

​ 简单理解就是底层 const就是等号右边不可变。

1.2 顶层 const

​ 顶层 const是指修饰对象本身不可变,但对象内容可以被修改。它常用于修饰对象的整体状态,而不是对象内容。

int *const ptr = new int(10);   // ptr是顶层const,指针本身不能被重新赋值
*ptr = 20;                     // 正确,指针指向内容可被修改
ptr = new int(30);             // 错误,ptr是顶层const,不能被重新赋值

​ 简单理解就是顶层 const就是等号坐标不可变。

1.3 二者区别

  • 底层 const:修饰的是对象内容,表示对象内容不可变;
  • 顶层 const:修饰的是对象本身,表示对象本身不可被替换或重新赋值;

2.const对象拷贝规则

​ 当执行对象拷贝操作时,常量的顶层 const不受影响,而底层 const必需一致。

const int * const ptr = new int(10); // 同时被顶层const和底层const修饰
const int *ptr1 = ptr;               // 正确

int *const ptr2 = ptr;               // 错误

​ 第一句的语义是 ptr指向内容不可改变,并且 ptr本身也不可改变。第二句表示 ptr1指向内容不可变,也即是 ptr指向内容不可变,和第一句定义相符,第三句表示 ptr2本身不可变,但是指向内容可变,这和第一句定义相违背,所以出错,这也就是第一句说的,底层 const必需一致。

3.参考资料


Comment