zoukankan      html  css  js  c++  java
  • 转 C++的常量引用

    C++的常量引用

    如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。对常量的引用可以用其它任何引用来初始化;但不能改变。

    关于引用的初始化有两点值得注意:

    1当初始化值是一个左值(可以取得地址)时,没有任何问题;

    2当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:

    首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。

    例子

    double& dr = 1; // 错误:需要左值

    const double& cdr = 1; // ok

    二句实际的过程如下:

    double temp = double(1);

    const double& cdr = temp;

     

    作函数参数时:
     1 // bc_temp_objects_not_bound_to_nonconst_ref.cpp
     2 // compile with: /EHsc
     3 #include "iostream"
     4 using namespace std;
     5 class C {};
     6 void f(C & c) { cout << "C&" << endl; }
     7 void f(C const & c) { cout << "C const &" << endl; }
     8 int main() {
     9   f(C());
    10 }
    
    结果:
    C const &
    更直接的,用基本类型:
     1 #include <iostream>
     2 using namespace std;
     3 void display(int const &ref) {cout<<ref<<'
    ';}
     4 int main()
     5 {
     6  int i=1;
     7  display(i);
     8  int const anotheri=2;
     9  display(anotheri);
    10  display(2);
    11  display(1+2);
    12  display(static_cast<int>(3.14159));
    13 }

    通过常量引用从函数返回一个局部对象:
    一般从一个函数返回一个局部对象的引用是不对的:   
     
    1 T   &   my_op   (   void   )  
    2   {  
    3       T   t;  
    4       return   t;  
    5   }   //   The   T   object   t   got   destroyed   here   so   the   returned   reference   is   not   valid   anymore.  

      特殊情况:返回一个常引用   
        
    1 const   T   &   my_op   (   void   )  
    2   {  
    3       T   t;  
    4       return   t;  
    5   }    
        
    1 const   T  &  my_t_obj   =   my_op   ();

      在这个情况下,局部变量   t   不会被直接析构,而是会保留到   my_t_obj   的生命周期结束为止。

    总之,常量引用语法上可以引用一个临时变量。这种方法在使用引用作函数参数和返回局部变量时有意义。
    我目前看来常量引用主要用在作函数参数或保证不修改原变量的时候。
    一些参考:
    http://topic.csdn.net/u/20080123/13/33c140ff-e213-417c-9d13-e672de4d9939.html
    http://msdn.microsoft.com/zh-cn/library/cfbk5ddc.aspx
    http://topic.csdn.net/t/20050209/18/3780754.html
    ...
  • 相关阅读:
    删除使用RMAN命令备份的文件
    查看.Net Framework版本的方法(zz)
    c# Foreach last (zz)
    Visual Studio 2008 QFE (zz)
    打印机的接口
    牛人的PENTAX单反之路
    我新进的宾得K10D机器和镜头
    买车险要有足额第三者责任险
    谈谈P家的SUPERTAKUAMR
    硬盘接口总结
  • 原文地址:https://www.cnblogs.com/njczy2010/p/5810520.html
Copyright © 2011-2022 走看看