cpp中复杂的const定义形式

191 阅读2分钟

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修饰的是什么?是类型还是指针?我总结了一个规律(可能不是很规范)

  1. 先找const左边的关键字是什么
  2. 如果const左边没有关键字,就看const右边的关键字
  3. 如果找到的关键字是一种类型(比如int)那么const修饰的就是对应的类型(比如 const intint const ,此时const修饰的就是int类型)
  4. 如果找到的关键字是* 就意味着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

这里我用一张图来概括

Untitled.png

顶层 : 对象本身是一个常量,也就是对象的值不能改

底层 : 指针所指向的对象是一个常量

拿个例子做解释:

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