首页 > 代码库 > const 限定符

const 限定符

一、关于初始化

  1. const对象一旦创建后就不能再改变,所以const对象必须初始化。

  2. const对象可以执行普通类型的绝大多数操作,但是不能执行改变其内容的操作。

const int i = getsize();     //正确:运行时初始化
const int i = 100;           //正确:编译时初始化
i=500;          //错误:不能改变const常亮
const int k;                     //错误:k未初始化

 

二、默认情况下,const对象只在文件内有效

  当以编译时初始化的方式定义一个const对象时,就如对下面bufSize的定义一样,编译器将在编译过程中把用到该变量的地方全部替换为对应的值。也就是说,编译器会找到代码中所有bufSize的地方,替换为512.

  为了执行上述变换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。为了做到这一点,就必须在每一个用到该变量的文件中定义它。为了支持这一用法,同时避免对同一变量的重复定义。默认情况下,const对象被设定为只在文件内有效。在多个文件中出现同名的const对象时,等同于与不同文件中分别定义了独立的变量。
  
  
有时候有的const变量,初始值不是常量表达式,但又确实有必要在文件间共享,那么可以像普通变量一样采用extern关键字。

  
  解决办法是,对于const变量不管是声明还是定义,都加上extern关键字,这样只需要定义一次就好了,如下所示。

//file1.cpp 中定义并初始化了一个常量,该常量要被其他文件共享。
extern const int bufSize = fcn(); 

//file1.h头文件
extern const intobufSize = fcn();

  

三、const引用

  把引用绑定到const对象上,称之为常量引用。

const int i=0;
const int& r1=i;  //正确,引用及其对应对象都时常量。
r1 = 32;             //错误,r1是常量引用
int & r2=i;          //错误:不能通过非常量引用指向一个常量对象。

  允许将const引用绑定到一个普通变量身上

int i=42;
const int& r1=i;    // 允许将const int& 绑定到 普通int对象上
const int& r2=42    //正确,r2是一个常量引用。
const int& r3=r1*2;    //正确,r3是一个常量引用
int & r4=r1*2;            //错误,r4是普通引用

  

const 限定符