免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3712 | 回复: 14
打印 上一主题 下一主题

关于引用的问题,迷茫中。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-22 12:51 |只看该作者 |倒序浏览

  1. {
  2. int ival = 2;
  3. int *p = &ival;
  4. int *&ref = p;//没有问题

  5. int *&ref2 = &ival;//error!!! 为什么这样就有问题呢?
  6. }
复制代码


如果涉及到类型转换,比如
double dval = 1024;
const int &ri = dval;//const应该在前面啊

目前我已经知道正确的形式是什么,但是一直不知道原因,各位能帮我解释一下吗?

[ 本帖最后由 思一克 于 2007-5-22 13:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-05-22 13:08 |只看该作者
帮你编辑了

论坛徽章:
0
3 [报告]
发表于 2007-05-22 13:23 |只看该作者
int  i;
int &ri = i;
是合法的。具体操作是将右边的东西的地址取来,付给左边

int* p;
int* &rpi = p;
合法。

int* &rpi = &i;
非法。右边的东西&i是常数,不能取地址了。

论坛徽章:
0
4 [报告]
发表于 2007-05-22 18:29 |只看该作者
原帖由 zhao_yi707 于 2007-5-22 12:51 发表

  1. int *&ref2 = &ival;//error!!! 为什么这样就有问题呢?
复制代码

原帖由 思一克 于 2007-5-22 13:23 发表

int* &rpi = &i;
非法。右边的东西&i是常数,不能取地址了。


int *const &ref2 = &ival;
这样才可以,因为&ival是一个常量
一个常量的引用要用const


原帖由 zhao_yi707 于 2007-5-22 12:51 发表

  1. double dval = 1024;
  2. const int &ri = dval;//const应该在前面啊

复制代码



楼主说:"const应该在前面啊"
楼主是什么意思?
实际上,编译器会生成一个临时变量存放dval被转换后的整数,
然后ri是这个临时变量的引用

论坛徽章:
0
5 [报告]
发表于 2007-05-22 20:54 |只看该作者
原帖由 ypxing 于 2007-5-22 18:29 发表




int *const &ref2 = &ival;
这样才可以,因为&ival是一个常量
一个常量的引用要用const




楼主说:"const应该在前面啊"
楼主是什么意思?
实际上,编译器会生成一个临时变量存放 ...


我的意思是,常量的引用应该是const在前面,比如:
const int &ir = 1024
//这个我是从c++ primer上看见的
但是,这里合法的形式却是:int *const &ref2 = &ival;
为啥不是 const int *&ref2 = &ival呢?

但是这里,您说

论坛徽章:
0
6 [报告]
发表于 2007-05-22 21:04 |只看该作者
原帖由 zhao_yi707 于 2007-5-22 20:54 发表


我的意思是,常量的引用应该是const在前面,比如:
const int &ir = 1024
//这个我是从c++ primer上看见的
但是,这里合法的形式却是:int *const &ref2 = &ival;
为啥不是 const int *&re ...


是这样的
在const int *...中
const是说某个int是常量(这种写法中,const只能修饰int,而不能修饰int *)

因为现在想说某个int指针是常量,所以只能把它写成
int * const &ir = 1024;
const 修饰的是ir, ir相当于是int *类型的

[ 本帖最后由 ypxing 于 2007-5-22 21:12 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-05-23 21:16 |只看该作者
>> int *&ref2 = &ival;//error!!! 为什么这样就有问题呢?

因为 &ival 是右值,所以对其进行引用的话只能进行 const 引用。

>> 右边的东西&i是常数,不能取地址了
>> 因为&ival是一个常量

这里的 &ival 既不是常量,也不是常数,而且这也不是引用非法的原因。

>> 一个常量的引用要用const

对于常量的引用固然要进行 const 引用,对于右值的引用、对于不兼容类型的对象的引用等都只能进行 const 引用。

>> int * const &ir = 1024;
>> const 修饰的是ir

const 和 ir 不相邻,所以修饰的不是 ir。C++ 标准也规定了不能直接用 cv 修饰引用变量。我们平时所说的 const reference 其实指的是 reference to const。

论坛徽章:
0
8 [报告]
发表于 2007-05-23 21:55 |只看该作者
原帖由 whyglinux 于 2007-5-23 21:16 发表
>> int *&ref2 = &ival;//error!!! 为什么这样就有问题呢?

因为 &ival 是右值,所以对其进行引用的话只能进行 const 引用。

>> 右边的东西&i是常数,不能取地址了
>> 因为 ...


说得比较正确,但有...之嫌

论坛徽章:
0
9 [报告]
发表于 2007-05-24 09:12 |只看该作者
我也弱弱的问一句..
    有没有指针类型的引用这一说法~?
  瞎说的!
  .....

论坛徽章:
0
10 [报告]
发表于 2007-05-24 09:55 |只看该作者
原帖由 windy2335 于 2007-5-24 09:12 发表
我也弱弱的问一句..
    有没有指针类型的引用这一说法~?
  瞎说的!
  .....


指针类型的变量也只是一个普通变量而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP