1、const对象一旦创建后其值就不能再改变,所以const对象必须初始化。与非const对象相比,只能在const类型对象上执行不改变其内容的操作。
2、如果想在多个文件之间共享const对象,必须在变量的定义前添加extern关键字。
//file_1.cc定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufsize = fcn();
//file_1.h头文件
extern const int bufsize;//与file_1.cc中定义的bufsize是同一个,bufsize并非本文件所独有,它的定义将在别处出现。
3、const的引用:同绑定到其他对象上一样,可以把引用绑定到const对象上,称对常量的引用。与普通应用不同,对常量的引用不能用作修改它所绑定的对象;
const int ci =1024;
const int &r1 = ci; // 把引用绑定到const对象上,引用也是const
r1 = 42; //错误,r1是对常量的引用
int &r2 = ci; //错误,试图用非常量引用绑定到一个常量对象。
4、因为引用的类型必须与其所引用对象的类型一致,但是有俩个例外(p46),第一种是初始化常量时允许用任意表达式作为初始值,只要该表达式的结果能转化成引用的类型即可。尤其允许一个常量的引用绑定到一个非常量的对象、字面值,甚至是一个表达式:
int i = 42;
const int &r1 = i ; //允许将一个常量引用绑定到非常量的对象
const int &r2 = 42 ;
const int &r3 = r1 * 2 ;
int &r4 = r1 * 2; //错误,r4是非常量引用
5、常量引用仅是对引用(只限定当前表达式定义的引用)可参与的操作做出了限定,对于引用的对象是不是一个常量未做限定,所引用的对象可能是个非常量,可以通过其它途径修改它的值。
int i = 42;
int &r1 = i; //非常量引用r1绑定i
const int &r2 = i;//r2是常量引用绑定i,但不允许通过r2修改i的值
r1 = 0; //正确
r2 = 0; //错误
6、指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能采用指向常量的指针。
const double pi = 3.14;
double *ptr = π//错误
const double *ptr = π//正确
* pi = 42;//错误
7、指针的类型必须与指向对象的类型一致(p47),俩个例外,第一是允许一个指向常量的指针指向一个非常量对象。
double dval = 3.14;
cptr = &dval;//正确,但不能通过cptr改变dval的值
与常量引用一样,指向常量的指针没有规定所指的对象必须是一个常量。指向常量的指针仅仅要求不能通过该指针改变对象的值,没有规定该对象的值不能通过其它途径改变。
8、const指针:指针是对象,允许指针本身定为常量。常量指针必须初始化,一旦初始化完成,它的值(存放在指针中的地址)不能再变,即一直指向那个对象。
int errNumb = 0;
int *const curErr = &errNumb; //curErr将一直指向errNumb
const double pi = 3.14159;
const double *const pip = π //pip是一个指向常量对象的常量指针(从右往左解读)第一个const解释(等式右边是一个常量的地址,要想存放一个常量的地址,必须要用一个指向常量的指针,即第一个const)
弄清楚指向常量的指针和指针常量
9、指针本身是一个对象,而且它又可以指向另一个对象;所以指针本身是不是常量以及指针所指的是不是一个常量就是俩个相互独立的问题。
顶层const表示指针本身是个常量;底层const表示指针所指的对象是一个常量。