const 常量
在cpp里面,常量有这么几种定义方式,因为混入了指针,一眼望去非常惊悚
int i = 0;
const int a = 10;
int const b = 20;
const int* c = &a;
int *const d = &i;
int const* e = &b;
const int *const f = &a;
const int& g = a;
接下来我来讲一下const的分辨方法
最重要的是看const修饰的是什么?是类型还是指针?我总结了一个规律(可能不是很规范)
- 先找const左边的关键字是什么
- 如果const左边没有关键字,就看const右边的关键字
- 如果找到的关键字是一种类型(比如int)那么const修饰的就是对应的类型(比如
const int和int const,此时const修饰的就是int类型) - 如果找到的关键字是
*就意味着const修饰的是指针(比如int* const,此时const修饰的是*)
const int a = 10; 这里const左边没有关键字,右边是int,那么a就是一个不可变的int常量
const int* c = &a; 这里const左边还是没有关键字,右边还是int,那么c就是一个可变的指针,指向一个不可变的int常量(const int)
int *const d = &i; 这里const左边是 * ,意味着这是一个常量指针,d本身是不能变的,也就是说永远都只能指向i,而i是一个变量,i的值可以变
顶层和底层
有时我们会听到有人用顶层const和底层const描述const
这里我用一张图来概括
顶层 : 对象本身是一个常量,也就是对象的值不能改
底层 : 指针所指向的对象是一个常量
拿个例子做解释:
int i = 0;
const int a = 10; // 顶层
int const b = 20; // 顶层
const int* c = &a; // 底层
int *const d = &i; // 顶层
int const* e = &b; // 底层
-
a 是一个常量,a 的值不能修改,也就是说 a 本身是一个常量 - 顶层
-
b 和 a 一样,b 的值也不能修改 - 顶层
-
c 是一个指针,指针所指向的是一个常量,而指针本身的值可以修改 - 底层
c = &b; // c可以修改指向 *c = 20; // error,c指向的是一个常量,不能修改常量的值 -
d 也是一个指针,指针指向的是一个变量,而指针本身不能修改指向 - 顶层
d = &i; // error,d是一个常量,不能修改指向 *d = 20; // 变量可以修改值 -
e 也是一个指针,指针指向的是一个常量,指针本身的值可以修改 - 底层
e = &a; *e = 10; // error
仔细理解这几个变量之后,应该就能理解顶层const和底层const了