编译器为了实现引用必须生成一个临时对象,引用实际上指向该对象但用户不能访问它例如当我们写
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果我们给ri 赋一个新值,则这样做不会改变dval,而是改变temp。
对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情
”如果我们给ri 赋一个新值“ 这句话说错了吧。
ri=3; 根本就不能编译通过。我想作者的本意是 dval=5; 之后 dval的值改变了,而ri的值并没有改变。这一点却是比较危险。怎么杜绝这一点危险呢?

解决方案 »

  1.   

    const int &rt = dval;
    这么写本来就有问题.
    类型应该是相同的.防止编辑器自作聪明的加临时变量.
      

  2.   

    在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。象const int &ri = dval;这样的常引用方式应该避免出现在非函数参数的地方,如果出现就会有楼主说的危险存在,个人认为常引用是为保护函数用引用的方式传递参数时,防止函数对原变量作修改而存在的一种引用方式.用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。常引用声明方式:const 类型标识符 &引用名=目标变量名;  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。int a ;
    const int &ra=a;
    ra=1; //错误
    a=1; //正确 
      

  3.   

    c++ priemer还说了.引用参数的一个重要用法是它允许我们在有效地实现重载操作符的同时还能保证用法的直观性.如果用指针
    Matrix operator+( Matrix *m1, Matrix *m2 )
    {
      Matrix result;
      // 在 result 中计算
      return result;
    }
    就得这么调用 &a + &b; // 不太好, 但也不是不可能.
    而且 &a + &b + &c; 不能工作
    必须 (&a + &b) +&c
    // 使用引用参数的新实现
    Matrix operator+( const Matrix &m1, const Matrix &m2 )
    {
      Matrix result;
      // 在 result 中进行计算
      return result;
    }
    该实现支持如下形式的Matrix 对象的加法
    a + b + c
      

  4.   

    终于明白了一些数学算法中,比如矩阵加法,有的用方便的重载+运算,有的却用不方便的
    add(&m1,&m2,&result)函数来运算了.因为+号,要求返回对象的,要进行对象的构造和拷贝,效率会低一些.非常细节的问题,今天终于明白了.