1.const 限定符
①定义const 对象
const 把一个对象转换成一个常量,常量在定以后不能被修改,所以定义时必须初始化。
const int bufSize = 512;
bufSize = 0; //任何修改bufSize的尝试都会导致编译报错
const int i, j = 0; // error:i 没有初始化
②const 对象默认为文件的局部变量
在全局作用域定义的const 变量是该文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
// file1.cpp 定义bufSize,该变量只能在file1.cpp访问,其他文件中是不可见的
const int bufSize = 512;
③非const 变量默认为extern 。要是 const 变量能够在其他文件中访问,必须指定它为 extern ,并在需要使用该变量的文件中 extern 声明。
//file1.cpp, 定义bufSize并声明为其他文件可访问
extern const int bufSize = 512;
//file2.cpp, 使用file1.cpp的bufSize
extern const int bufSize;
for (ini index = 0; index != bufSize; ++index)
//...
④问题:为何const 对象局部与文件创建?
2.引用
引用就是对象的另一个名字(别名)。实际程序中,引用主要用作函数的形参。引用是一个符合类型,通过在变量名前添加“&”符号来定义。
1.复合类型是指用其他类型定义的类型。不能定义引用类型的引用,可以定义其他类型的引用
2.定义引用时必须用与该引用同类型的对象初始化
3.初始化时指明引用指向哪个对象的唯一方法
4.当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象,不可能将引用绑定到另一对象
int i = 1024, i2 = 2048;
int &r = i; r2 = i2; //r is a reference, r2 is a int
int i3 = 1024, &ri = i3; //defines one object, and one reference
int $r3 = i3, &r4 = i2; //defines two references
3.const 引用
严格来说:const 引用是指向 const 类型的引用
但是:
①const引用可以绑定到不同但相关的类型的对象或绑定到右值。因为const引用是只读的
int i = 42;
// legal for const references only
const int &r = 42;
const int &r2 = r + i;
②非const 引用不能初始化为不同类型的对象和右值,即非const引用只能绑定到同类型变量上
double dval = 3.14;
const int &ri = dval;
//编译器会把这些代码装换成如以下形式的编码
int temp = dval; //create temporary int from the double
const int &ri = temp; //bind ri to that temporary
解释:如果ri不是const,那么就可以给ri赋一个新值,但是这么做不会修改dval,只是修改了temp。期望对ri的赋值会修改dval的程序员会发现dval并没有被修改。只允许const引用绑定到需要临时使用的值则完全避免了这个问题,因为const引用是只读。
因此:非const引用只用绑定到与该引用同类型的对象。