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
必需一致。