const 限定符

185 阅读2分钟

1、const 引用

引用定义时,引用和初始值就绑定在一起,无法修改引用指向的对象,所有的引用都是常量

对常量的引用(reference to const)

对常量的引用,不能用来修改其引用的对象。

int a = 100;
const int b = 10;
const int &ref = b; // 正确

ref = a;   // 错误,不能修改,引用初始化完成后不可修改;
ref = 100; // 错误,不能修改,ref是常量引用;

2、const 指针

指向常量的指针(pointer to const)

不能改变其所指对象的值。

int a = 100, b = 200;
const int *p = &a;

p = 1000; // 错误,指针常量不能修改指向对象的值;
p = &b;   // 正确,可以修改指针指向的对象;

常量指针(const pointer)

必须初始化,初始化后不能改变指向的位置(相当于存放当前指针的地址不能被修改)。

int a = 100, b = 200;

int *const p;              // 错误,常量指针必须初始化
int *const pointer_a = &a; // 正确,常量指针

const int *pointer_b = &a; // 指向常量的常量指针

3、顶层和底层 const

顶层const:指针本身是个常量。

底层const:指针所指对象是个常量。

int a = 100;
const int b = 200;

int *const p1 = &a;        // 指针所指对象不是常量,顶层
constconst int *p2 = &a;   // 指针所指对象不允许修改,底层

constconst int *p3 = &b;       // 所指对象是常量,p3的值可以修改,底层
constconst int *const p4 = &a; // 左边const为底层const,右边const为顶层

当变量进行copy时,顶层const可以忽略,底层const不可以忽略。

一般来说非常量可以转换为常量,反之不可以。

int a = 100;
const int b = 200;

const int *a1 = &a; // 正确
const int *b1 = &b; // 正确
int *b2 = &b;       // 错误,底层const不可以忽略。