| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 409 人关注过本帖
标题:一个简单的实验
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:20 回复次数:7 
一个简单的实验
程序代码:
#include <iostream>
#include <Windows.h>
using namespace std;

 
int main(void)
{
    system("cls");
   
    const int a = 1;
    const int &b = a;
    cout << &a << " VS " << &b << endl;

    const float a1 = 1.0;
    const int &b1 = a1;
    cout << &a1 << " VS " << &b1 << endl;

    int a2 = 1;
    const int &b2 = a2;
    cout << &a2 << " VS " << &b2 << endl;

    int a3 = 1;
    int &b3 = a3;
    cout << &a3 << " VS " << &b3 << endl;

   
    const int a4 = 1.0;
    int &b4 = a4;
    cout << &a4 << " VS " << &b4 << endl;
   
    system("pause");
    return 0;
}

大家先 目测下 这5种方式的引用是不是都成立 如果成立那么输出的结果都是些什么 ?
搜索更多相关主题的帖子: system 
2012-07-28 10:46
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:7 
相同类型的肯定是可以引用的,比如第一个和第四个。不同类型的应该是不能了吧,比如第二个。
限定符级别高的肯定能引用级别低的,比如第三个。但反过来应该不行,比如最后一个。

我本来觉得输出的结果可能会不一样,因为感觉它也是一个变量,因此在定义时应该分配独立的存储空间。
不过实验了下,发现在 gcc 下,它们输出的值是一样的。去查了标准,发现这种行为是未明确:
8.3.2 References
3 It is unspecified whether or not a reference requires storage. (引用是否要求存储空间是未明确的。)
2012-07-28 17:39
zhuanjia0
Rank: 4
等 级:业余侠客
威 望:3
帖 子:86
专家分:232
注 册:2012-1-13
收藏
得分:7 
这个问题我在C++Primer的引用那章有看到过,第二个是可以的。
     const float a1 = 1.0;
     const int &b1 = a1;
     cout << &a1 << " VS " << &b1 << endl;

书中原话:
const引用可以初始化为不同类型的对象或者初始化为右值。
 
2012-07-28 18:00
zhuanjia0
Rank: 4
等 级:业余侠客
威 望:3
帖 子:86
专家分:232
注 册:2012-1-13
收藏
得分:0 
经过测试,只有第五个无法通过编译。

0012FF7C VS 0012FF74
0012FF70 VS 0012FF68
0012FF64 VS 0012FF64
0012FF5C VS 0012FF5C
2012-07-28 18:20
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗯。还真是。没注意过这种引用,长长见识。而且把 const 去掉就不行。看来有容研究了,回头听听有容的解释。
我之前没有编译有容的那个代码,在我这执行,只有第二个不是相同的地址。


[ 本帖最后由 pangding 于 2012-7-28 18:26 编辑 ]
2012-07-28 18:24
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
呵呵 我的结果是 就只有第五个 也就是最后一个是非法的

如果 const int a4 = 1.0;
     int &b4 = a4;
成立 那么当修改b4的时候 a4岂不是被修改了
至于前面四个 确实可以 const引用确实可以初始化为不同类型的对象。 所以
    const float a1 = 1.0;
    const int &b1 = a1;  是成立的
至于输出结果 呵呵在VC6下和VS2010下不太一样 可能和编译器有关~~
VC6下
图片附件: 游客没有浏览图片的权限,请 登录注册

---
VS2010下
图片附件: 游客没有浏览图片的权限,请 登录注册

但可以肯定的是当const引用初始化为不同类型的对象时 是有临时变量在参与的 所以地址不一样。

梅尚程荀
马谭杨奚







                                                       
2012-07-28 20:16
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:7 
const int  a = 1;
const int& b = a;
const_cast<int&>(b) = 2; // 这样修改的仅仅是a的一个常量复本。
对于const引用,恐怕它只是一个复本的引用,编译器怕你通过转换来取消引用的常量性来改变一个它引用的常量。

My life is brilliant
2012-07-29 00:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 7楼 lz1091914999
但是不敢确定不同编译器的不同类型之间常量引用是否有常量复本在参与。

梅尚程荀
马谭杨奚







                                                       
2012-07-29 10:08
快速回复:一个简单的实验
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016616 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved