注:
const 是左结合的,若左边为空,则向右结合
引用
引用: 为对象起一个别名。必须初始化,程序会把引用和它的初始值绑定在一起,此后无法再令引用重新绑定到两外一个对象,因此引用必须初始化。
对const的引用: 即常说的常量引用,对常量的引用不能被用作修改它所绑定的对象。
const int ci = 1024;
const int &r1 = ci; // 正确,引用及其对应的对象都是常量
r1 = 42; // 错误:r1是对常量的引用
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象。
对const的引用可能引用一个并非const的对象: 常量引用只是对引用可参与的操作做出了限定,对引用的对象本身是不是一个常量并未限定。
指针
空指针: 不指向任何对象,如下方法用来初始化一个指针:
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
推荐nullptr,它可以被转换成任意其他的指针类型。
void*指针: 一种特殊的指针类型,用于存放任意对象的地址。利用它能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋值给另外一个void*指针。不能直接操作void*指针所指的对象,因为我们并不知道这个对象是什么类型,也就无法确定能在这个对象上做哪些操作。
指向常量的指针: 和常量引用一样,指向常量的指针也没有规定其所指对象必须是一个常量。仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。
这样想:所谓指向常量的指针或引用,不过是指针或引用“自以为是”罢了,它们觉得自己指向了常量,所以自觉的不去改变所指对象的值。
指向常量的指针: 不能改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。
const double pi = 3.14; // pi是个常量,它的值不能改变
double *ptr = π // 错误:ptr是一个普通指针
const double *cptr = π // 正确:cptr可以指向一个双精度常量
*cptr = 42; // 错误:不能给*cptr赋值
const指针: 必须初始化,且之后不能改变。把*放在const前面来说明指针是一个常量。这个含义是说不变的是指针本身的值,而非指向的那个值。
int errNumb = 0;
int *const curErr = &errNumb; // currErr将一直指向errNumb
const double pi = 3.14;
const double *const pip = π // pip是一个指向常量对象的常量指针
顶层const与底层const:
指针本身是一个对象,它可以指向另外一个对象。因此指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。所以有了顶层const和底层const的概念:
顶层const:表示指针本身是一个常量
底层const:表示指针所指的对象是一个常量
Ref:
C++ Primer
- END -