C++ Return语句返回的都是副本吗

X366ING 2012-09-07 10:02:27
学习C++的过程中遇到一个疑问,return语句返回的都是副本么,对于用户自己定义的一个类,返回的是副本(这里不考虑浅拷贝和深拷贝的问题),对于系统内置类型,像int,char型等,返回的也是一个副本么?求人指教
int fun(int a)
{
....
return a; //这里的a 和 参数中的a是同一个么,返回的是a还是a的副本?
}

int &fun2(int &b) //这里的b是外面实参的副本?
{
....
return b; //返回的是b还是b的副本?
}
...全文
632 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2012-09-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20111209/11/224e9d76-192c-4a2f-814c-b1ac3457f9f4.html?97647

看书.
别看国内的大部分垃圾书.
ArdourCareful 2012-09-07
  • 打赏
  • 举报
回复 1
编译器总是要在函数体中为每个参数制作临时副本(引用例外),就算你函数的形参是指针类型,但在函数体也是保存了形参的副本,因为是指针,所以对副本的修改,同样也表现在的了外面的变量上.现在总明白了吧,因此,第一个返回的就是副本,第二个返回的就是变量本身.....
Corner 2012-09-07
  • 打赏
  • 举报
回复
int fun(int a)
{
....
return a; //a和参数中的a是同一个,都是外面实参的副本(拷贝),返回的是副本(拷贝)。
}

int &fun2(int &b) //这个就是外面的实参,并非副本(拷贝)
{
....
return b; //返回的就是b,并非副本,也就是外面的实参
}
Gloveing 2012-09-07
  • 打赏
  • 举报
回复
int fun(int a)
{
....
return a; //这里的a 和 参数中的a是同一个,都是一个临时变量
}

int &fun2(int &b) //注意这里传的是引用
....
return b; //}
iamnobody 2012-09-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20111209/11/224e9d76-192c-4a2f-814c-b1ac3457f9f4.html?67728

估计你看的书不太好...
不要看国内的书! 看C++ primer

答案见链接.

  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C……
[/Quote]

好久不上CSDN发现您的台词都换了! - -!
Enter空格 2012-09-07
  • 打赏
  • 举报
回复
无论是什么类型
return也只能返回一个当前通用寄存器长度可容纳下的值。
如果返回值是个整数或指针,那么直接使用这个值。
如果返回的是个结构,那么会只用这个值进行索引,此时这个值就相当于一个指针。
return时,所有的返回值都是存储在通用寄存器ax,eax,rax中的。
赵4老师 2012-09-07
  • 打赏
  • 举报
回复 2
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

64,650

社区成员

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

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