定义
- 变量一旦被初始化了,就不能被改变。
- const对象必须初始化
- 使用关键字"const"。
- 默认状态下,cosnt对象仅在文件内有效,如果想在多个文件之间共享,必须要在变量的定义前加上"extern"关键字。如:extern const int bufSize
例
const int bufSize = 512;
bufSize = 513; //错误,试图向const对象写值
const引用
- 1.把对象绑定到const对象个,就像绑定到其他对象上一样。称为"常量引用"
- 2.引用的类型必须与其所引用对象的类型一致。初始化除外(只要该表达式能转化成引用类型即可)
例
//1
const int ci = 1024;
const int &r1 = ci; //正确:引用及其对应的对象都是常量
r1 = 42; //错误:r1是对常量的引用
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量对象
//2
int i = 42; //允许将const int&绑定到一个普通int对象上
const int &r1 = i; //正确:r1是一个常量引用
const int &r2 = 42; //正确:r3是一个常量引用
const int &r3 = r1 * 2; //错误:r4是一个普通的非常量引用
//类型不一致会怎样
double dval = 3.14;
const int &ri = dval;
//转换过程:编译器会创建一个临时变量在暂存表达式,导致最终引用的非原本想引用的变量
const int temp = dval; //由双精度浮点数生成一个临时的整型常量
const int temp = dval; //由双精度浮点数生成一个临时整型常量
const int &ri = temp; //让ri绑定这个临时量,最终ri引用的不是dval,而是temp
指针与const
指针常量
- 可以令指针指向常量,即指向常量的指针(存放常量地址的指针)。
- 指针常量:不能用于改变其所指对象的值。但可以用于指向一个非常量对对象
例
const double pi = 3.14; //pi是个常量,它的值不能改变
double *ptr = π //错误:ptr是一个普通指针
const double *cptr = π //正确:cptr可以指向一个双精度常量
*cptr = 42; //错误:不能给*cptr赋值
double dval = 3.14; //dval是一个双精度浮点数,它的值可以改变
cptr = &dval; //正确:但是不能通过cptr改变dval的值
常量指针
- 即该指针本身是常量。
- 必须初始化,一旦初始化完成,则它的值(即存放在指针中的地址)就不能改变
- *放在const关键字之前用以说明指针是一个常量
例子
int errNumb = 0;
int *const currErr = &errNumb; //curErr将一直指向errNumb,无法改变
const double pi = 3.14159;
const double *const pip = π
*pip = 2.72; //错误:pip指向的就是一个常量的指针,所以不能改变
*curErr = 8; //正确:可改变,currErr指向的是一个int类型的常量指针,不可改变的是其地址,并不是对象的值
识别方法
要弄清楚这些声明最有效的方法是从右向左阅读。上例中离currErr
最近的是const,表示其是一个常量,接着下一个符号是*
代表是一个指针,*const
表示为是一个常量指针,即int *const currErr
是一个常量指针,指向的是一个int
类型。按上面的方法推断const double *const pip
,可知pip
是一个常量指针,指向的是const double
类型。