c++ primer中的一段话的错误和引用的危险

wd_6532 2006-01-21 07:41:30
编译器为了实现引用必须生成一个临时对象,引用实际上指向该对象但用户不能访问它例如当我们写
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果我们给ri 赋一个新值,则这样做不会改变dval,而是改变temp。
对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情


”如果我们给ri 赋一个新值“ 这句话说错了吧。
ri=3; 根本就不能编译通过。

我想作者的本意是 dval=5; 之后 dval的值改变了,而ri的值并没有改变。这一点却是比较危险。

怎么杜绝这一点危险呢?

...全文
228 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torrice 2006-01-22
  • 打赏
  • 举报
回复
在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。象const int &ri = dval;这样的常引用方式应该避免出现在非函数参数的地方,如果出现就会有楼主说的危险存在,个人认为常引用是为保护函数用引用的方式传递参数时,防止函数对原变量作修改而存在的一种引用方式.用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

常引用声明方式:const 类型标识符 &引用名=目标变量名;

  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。

int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确

property1 2006-01-22
  • 打赏
  • 举报
回复
类型不一致的 引用, 引用的意义就没了
DentistryDoctor 2006-01-22
  • 打赏
  • 举报
回复
const int&?
int&?
herman~~ 2006-01-22
  • 打赏
  • 举报
回复
关注
wd_6532 2006-01-22
  • 打赏
  • 举报
回复
终于明白了一些数学算法中,比如矩阵加法,有的用方便的重载+运算,有的却用不方便的
add(&m1,&m2,&result)函数来运算了.

因为+号,要求返回对象的,要进行对象的构造和拷贝,效率会低一些.

非常细节的问题,今天终于明白了.
一个傻冒 2006-01-22
  • 打赏
  • 举报
回复
const int &rt = dval;
这么写本来就有问题.
类型应该是相同的.防止编辑器自作聪明的加临时变量.
wd_6532 2006-01-22
  • 打赏
  • 举报
回复
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
vcmute 2006-01-21
  • 打赏
  • 举报
回复
别作错误的引用

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧