C++ const 限定符

const 限定符


1、
  const int BufSize = 512;
  BufSize = 512;//错误,试图向const对象写值


2、因为const对象一旦创建后其值就不能被再改变,所以const对象必须初始化。一如既往,初始值可以是任意复杂的表达式;'
  
   const int i = get_size();//正确,运行时初始化
  
   const int j = 42; //正确,编译时初始化
  
   const int k;//错误,k是一个未经初始化的常量


3、初始化和const
  
   1、初始化不改变值,可用const去赋值。


   2、默认状态下,const对象仅在文件内有效。
   
   ---文件内有效的解释:
      
      当以编译时初始化的方式定义一个const对象时,就如对bufSize的定义一样,
      const  int bufSize = 512;//输出缓冲区大小


     编译器将在编译过程中把用到该变量的对方都替换成对应的值。也就是说,编译器会找到所有代码中所有用到bufSize的地方,然后用512替换。
     为了执行上述替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都对它有定义。为了支持这一用法,同时避免对同一个变量的重复定义,默认情况下,const对象被设定仅在文件内有效。当多个文件出现了同名的const变量时,其实等于在不同文件中分别定义了独立的变量。


4、extern


   某些时候有这样一种const变量,它的初始值不是一个常量表达式,但又确实有必要在文件间共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。相反,我们想让这类const对象像 (非常量)对象一样工作,也就是说,只在一个文件中定义const,而在其他多个文件中声明并使用它。 


   解决的办法是:对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就可以了:
   
//file_1.cc定义并且初始化了一个常量,该常量能被其他文件访问。
    extern const int bufSize = fcn();
  
    extern const int bufSize;//file_1.h 头文件
          //与file_1.cc中定义的bufSize是同一个
 
  说明:定义(给值)的时候前面加上extern,表示这个变量并非本文件所独有,它的定义可以在别的地方出现,其他文件可以使用。


5、const的引用


   可以把把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用”。与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象。 


   ★错误:试图让一个非常量引用指向一个常量对象


6、初始化和const的引用


   ★记住一个等式:
   
   对const的引用  = 常量引用


   1、之前提过,引用的类型必须与所引用的对象类型一致,现在介绍一种例外:


   1、在初始化“常量引用”时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
    尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:


    const &r4 = r1*2;//其中ri是一个常量引用


    const int &r2 = 42;//常量引用可以绑定字面值


   2、这里需要说明一下:对const的引用可能引用一个并非const对象:简而言之,即使允许用一个const引用一个非常量对象,但是不能通过这个const对象来改变这个非常量。例如:
  
       int i = 42;
       int &r1 = i;
       const int &r2 = i;//r2绑定了i,但是不能通过r2改变i的值
       r1 = 0;//正确
       r2 = 0;//错误


    













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值