const 限定修饰符
常量,在程序中任何改变这个值的企图都将导致编译错误 因此 它被称为是只读的[read- only]。因为常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误 。
minWage 是一个常量对象 因此它不能被改写为一个新的值
const double minWage = 9.60;
cptr 是一个指向double 类型的const 对象的指针
const double *cptr;
我们可以从右往左把这个定义读为: cptr 是一个指向double 类型的 被定义成const 的对象的指针。此中微妙在于cptr 本身不是常量 我们可以重新赋值cpt,使其指向不同的对象 但不能修改cptr 指向的对象。例如
const double *pc = 0;
const double minWage = 9.60;
// ok: 不能通过 pc修改 minWage
pc = &minWage;
double dval = 3.14;
// ok: 不能通过 pc修改 dval
// 虽然 dval本身不是一个常量
pc = &dval; // ok
dval = 3.14159; // ok
*pc = 3.14159; // 错误
const 对象的地址 只能赋值给指向const 对象的指针 例如pc 但是 指向const 对象的指针可以被赋以一个非const 对象的地址 例如
pc = &dval;
虽然dval 不是常量 但试图通过pc 修改它的值 仍会导致编译错误 因为在运行程序的任意一点上 编译器不能确定指针所指的实际对象
在实际的程序中 指向const 的指针常被用作函数的 形式参数 它作为一个约定来 保证被传递给函数的实际对象在函数中不会被修改
引用类型
引用 reference 有时候又称为别名[alias]。引用类型由类型标识符和一个取地址操作符来定义 引用必须被初始化
例如
int ival = 1024;
// ok: refVal是一个指向 ival的引用
int &refVal = ival;
// 错误 引用必须被初始化为指向一个对象
int &refVal2;
引用也可以被用作一种指针 我们可以定义一个指针引用 例如
int ival = 1024;
// 错误 refVal是 int类型, 不是 int*
int &refVal = &ival;
int *pi = &ival;
// ok: refPtr是一个指向指针的引用
int *&ptrVal2 = pi;
一旦引用已经定义 它就不能再指向其他的对象
int min_val = 0;
// ival被设置为 min_val 的值
// refVal并没有引用到 min_val 上
refVal = min_val;
以上代码等价于
ival=0
const 引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量 例如
double dval = 3.14159;
// 仅对于 const引用才是合法的
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval + 1.0;
同样的初始化对于非const 引用是不合法的 将导致编译错误