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不可以忽略。