返回对象的引用的疑惑

herostarone 2010-11-23 08:32:14
一.string a= “abc”;//全局
string get()
{
return a;
}

1.string b =get();
2.string b;
b=get();




二.string a= “abc”;//全局
string & get()
{
return a;
}

1.string b =get();
2.string b;
b=get();


两个大情况:
情况一:return a的时候首先产生一个临时对象,然后调用复制构造函数把a复制给临时对象。1.string b =get();
然后又调用复制构造函数,将临时对象复制给b。
2.string b;
b=get();

然后又利用重载“=”号进行赋值。

情况二:retrun a的时候不产生临时对象。为什么不产生临时对象呢
1.string b =get();
b是a的引用,相当于string &b = a;//这块不知道理解是否对,但是我有点疑惑为啥返回的&在右边,现在跑左边了。
2.string b;
b=get();

这种就更不理解了。
因为int &a =b是正确的,但是
int a;
&a = b是错误的。
而这种情况该如何分析呢?

...全文
183 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinfei8848 2010-11-24
  • 打赏
  • 举报
回复
编译器的优化可能会误导你对这些东西的认识
yiruirui0507 2010-11-24
  • 打赏
  • 举报
回复
我支持楼主的某些说法,当然前提是暂不考虑编译器的优化问题.
楼主看看这个就明白了:
http://blog.csdn.net/yiruirui0507/archive/2010/10/30/5976786.aspx
nicklisir 2010-11-24
  • 打赏
  • 举报
回复
完成任务!
herostarone 2010-11-24
  • 打赏
  • 举报
回复
明白,返回的引用呢

[Quote=引用 9 楼 zhao4zhong1 的回复:]
引用即别名!
[/Quote]
赵4老师 2010-11-24
  • 打赏
  • 举报
回复
引用即别名!
szgrape 2010-11-24
  • 打赏
  • 举报
回复
+1
[Quote=引用 1 楼 gules 的回复:]
两种情况下的第1点,即 string a = get(); 都不会产生临时对象(情况一下编译器优化了,是直接调用string的拷贝构造函数);

你对赋值操作符的概念没有正确理解,“函数返回引用再赋值给一个对象”与“引用对象的初始化”是两码事!
[/Quote]
luciferisnotsatan 2010-11-24
  • 打赏
  • 举报
回复
string &b = a
引用,起了个别名(给了个外号)。b和a都是同一个东西。编译后,就没什么a,b这种名字了,就一个地址
herostarone 2010-11-24
  • 打赏
  • 举报
回复
能解析下为何错了吗

[Quote=引用 3 楼 lthyxy 的回复:]
b是a的引用,相当于string &b = a;//这块不知道理解是否对,但是我有点疑惑为啥返回的&在右边,现在跑左边了。

错了。b怎么会是a的引用呢,你去修改一下b的值啊,看a是否改变了就知道到底有没有绑定引用了。

因为你这里就理解错了,所以后面的就更加错了。
[/Quote]
herostarone 2010-11-24
  • 打赏
  • 举报
回复
引用不能赋值吗,呵呵,我感觉也不能,但是语法好像没错吧


[Quote=引用 2 楼 qq120848369 的回复:]
引用只能叫做初始化,不能赋值,楼主的那句语法本身就错.
[/Quote]
herostarone 2010-11-24
  • 打赏
  • 举报
回复
1.两种情况下的第1点,即 string a = get(); 都不会产生临时对象(情况一下编译器优化了,是直接调用string的拷贝构造函数);
情况一的第一点也不产生临时对象吗,我看的一本书国外的C++捷径教程上这么写的,如果是编译器直接优化,那么做个实验应该可以看得出来吧。
2。你对赋值操作符的概念没有正确理解,“函数返回引用再赋值给一个对象”与“引用对象的初始化”是两码事!
对,这个我还真有点糊涂,还请解析一下哈


[Quote=引用 1 楼 gules 的回复:]
两种情况下的第1点,即 string a = get(); 都不会产生临时对象(情况一下编译器优化了,是直接调用string的拷贝构造函数);

你对赋值操作符的概念没有正确理解,“函数返回引用再赋值给一个对象”与“引用对象的初始化”是两码事!
[/Quote]
赵4老师 2010-11-24
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
liutengfeigo 2010-11-23
  • 打赏
  • 举报
回复
b是a的引用,相当于string &b = a;//这块不知道理解是否对,但是我有点疑惑为啥返回的&在右边,现在跑左边了。

错了。b怎么会是a的引用呢,你去修改一下b的值啊,看a是否改变了就知道到底有没有绑定引用了。

因为你这里就理解错了,所以后面的就更加错了。
qq120848369 2010-11-23
  • 打赏
  • 举报
回复
引用只能叫做初始化,不能赋值,楼主的那句语法本身就错.
gules 2010-11-23
  • 打赏
  • 举报
回复
两种情况下的第1点,即 string a = get(); 都不会产生临时对象(情况一下编译器优化了,是直接调用string的拷贝构造函数);

你对赋值操作符的概念没有正确理解,“函数返回引用再赋值给一个对象”与“引用对象的初始化”是两码事!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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