当前位置:C++技术网 > 资讯 > const--const引用中的几个微妙之处

const--const引用中的几个微妙之处

更新时间:2016-03-17 22:47:28浏览次数:1+次

   像100这样的值,在程序中被当作字面值常量,称之为字面值常量是因为只能用它的值称呼它,称之为常量是因为它的值不能修改。

   我们定义一个变量val,给它赋值100,那么就可以用val代替100出现在程序的各个角落。这样做的好处是程序的可读性增强了,当需要将程序中多次用到的100修改为其他值时,可以通过修改val的值来达到一劳永逸的目的。

   如果想要定义的变量是不可被修改的,那么在定义的变量前加上const限定符就可以了,


  const int val=10;
  int const val=10;

   上面这两种定义方式都是正确的。因为常量在定义之后是不可以被修改的,所以用const限定的变量在定义是必须进行初始化,定义之后任何要修改这个变量值的操作都是错误的。

   这便是用const限定一个变量是需要注意的地方,也没有什么很特别的地方。当const与引用结合使用的时候,就有了一些特别的地方。

   引用就是对象的另一个名字。对于我们定义的一个变量:


  int a = 10;

   假设10存放在内存中的地址是0x12345678,那么a是这块地址的名字,10是这个地址所代表的位置中的内容。而引用:


  int &b=a;


对于这个地址又有了一个名字b,通过ab都可以访问这个地址中的内容,也可以对内容进行修改。对于一个变量可以随便定义几个引用。

   const引用是指向const对象的引用。一般的const引用,也很好理解,为一个const对象定义一个引用:


  const int val=100;
  const int &refval=val;

 const限定的变量val只可以读取不可以修改,因此任何对refval的修改也是不合法的。非const引用是不可以绑定const限定的变量的。下面这样引用是非法的

  const int val=100;
  int &ref=val;   //error
 ref是普通的非const引用,是可以通过ref改变它所指向的值的,但val是不可以修改的,所以这样的引用是不合法的。但是,对于下面这种引用是合法的,


  int buf=100;
  const int &rebuf=buf;

 这种是const引用绑定了普通变量,buf的值是可以改变的,buf的值修改以后,rebuf的值也随之修改,但是不可以对rebuf赋值,这是const限定了使用rebuf改变部分的值。

   const引用可以直接绑定字面值常量,而非const引用却不可以

  const int &val=10;    //ok
  int &su=10;   //error

 这是const引用其中的一个特别之处,因为对于不能直接寻址的字面值常量10,在编译时会自动生成一个临时变量,上面对常量10的const引用,在编译的时候编译器会把代码转换成下面的的形式,

  int temp = 10 ;
  const &int val=temp;

   const引用还可以绑定到不同但相关的类型的对象,

  double x=20;
  const int &y=x;   //ok
编译时,
  int temp=20;
  const int &y=temp;

  cout<<&x<<endl;   //输出变量地址
  cout<<&y<<endl;

   而非const引用没有这样的初始化方式,const引用可以这样,也是因为在编译的时候编译器会生成一个临时变量,const引用y绑定的是int型临时变量而不是double型的x,因此改变x的值对y的值没有任何影响,y依然是初始化的值。输出两个变量的地址可以看到,它们的地址是不同的。