当以编译时初始化的方式定义一个const对象时:
const int bufSize = 512;
编译器将在编译过程中把用到该变量的过程都替换成对应的值,也就是说编译器会找到代码中所有用到bufSize的地方然后用512替换。
为了执行上述替换编译器必须知道变量的初始值,如果程序包含多个文件,则每个用到了const对象的文件必须都能访问的到它的初始值才行。要做到这一点就必须在每个用到该变量的文件中都有对该变量的定义(而不是声明)。为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在当前文件内有效。当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
如果我们希望const对象像其他(非常量)对象一样工作,就是只在一个文件中定义,而在其他文件中声明并使用它,解决的办法就是对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就够了。
// file_1.cc 定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
// file_1.h 与 .cc 文件中定义的bufSize是同一个
extern const int bufSize;
关于常量引用,不能通过对常量的引用修改常量,还有就是不能让一个非常量的引用指向一个常量对象
const int ci = 1024;
int &r1 = ci; // err
另外,引用的类型必须与其所引用对象的类型一致,这点在对常量引用中会有例外
double dval = 3.14;
const int &ri = dval; // ok
// int &re = dval; // err
原因是,为了确保操作对类型一致的要求,编译器把代码做了如下转换:
const int temp = dval; // 生成一个临时量
const int &ri = temp; // 把ri绑定到临时量
对于非常量的情况,c++会把这种行为归为非法。
Note: const引用所引用的对象可能是一个并非const的对象,指向常量的引用或指针,只是引用或指针“自以为是”罢了,这个被const修饰了的指针或引用所指向的值,是可以通过其他方式修改的。
摘自: C++ Primer