鱼C论坛

 找回密码
 立即注册
查看: 4676|回复: 11

临时对象的创建问题 拷贝构造函数??求解答

[复制链接]
发表于 2012-9-17 19:14:36 | 显示全部楼层 |阅读模式
1鱼币
  • 请看下面带?号的疑惑
  • include <iostream>  
  • using namespace std;  
  •   
  • class B {  
  • public:  
  •     B():data(0) {   
  •         cout << "default constructor " <<  data <<endl;  
  •     }  
  •     ~B() {  
  •         cout << "destructed by parameter " << data <<endl;  
  •     }  
  •     B(int i):data(i) {  
  •         cout << "constructed by parameter " << data <<endl;  
  •     }  
  •     B(B &b) {  
  •         data = b.data;  
  •         cout << "coped by parameter " << data <<endl;  
  •     }  
  •     B & operator = (const B &b) {  
  •         this->data = b.data;  
  •         cout << "= by parameter " << data << endl;  
  •         return *this;  
  •     }  
  • private:  
  •     int data;  
  • };  
  •   
  • B play(B b) {  
  •     return b;  
  • }  
  •   
  • int main () {  
  •     play(1);
  •     B t1 = play(2);
  •     B t2;  
  •     t2 = play(3); //求解答??为什么这句还调用拷贝构造函数来构建一个临时对象,t2已经存在,为什么还要一个临时对象呢????
  •   
  •     return 0;  
  • }  


                               
登录/注册后可看大图

最佳答案

查看完整内容

B t2; t2 = play(3); 等价于 B t2; t2 = play(B(3)); 整个过程是这样的,首先通过B(3)产生一个无名的临时对象 接着,因为B play(B b);的参数传递是值传递,所以调用B的拷贝构造函数来初始化实参b 再接着,play函数的返回也是值传递,所以调用B的拷贝构造函数,用b来初始化play函数返回的临时对象. 接着t2 = play返回的临时对象 这里调用B的operator=(play返回的临时对象) 由于默认产生的operator=的参数是引用传递,不是 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-17 19:14:37 | 显示全部楼层
B t2;   
t2 = play(3);
等价于
B t2;   
t2 = play(B(3));
整个过程是这样的,首先通过B(3)产生一个无名的临时对象
接着,因为B play(B b);的参数传递是值传递,所以调用B的拷贝构造函数来初始化实参b
再接着,play函数的返回也是值传递,所以调用B的拷贝构造函数,用b来初始化play函数返回的临时对象.
接着t2 = play返回的临时对象
这里调用B的operator=(play返回的临时对象)
由于默认产生的operator=的参数是引用传递,不是值传递,所以这里不会调用B的拷贝构造函数.

整个过程如上.另外提醒LZ一下,这样的分析仅仅是为了熟悉对象的生死.实际上,一般的C++编译器都会对该过程进行一定程度的优化,从而省略其中的一些没有必要的临时对象,具体的LZ可以baidu "NRV优化"
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 05:10:02 | 显示全部楼层
楼主,你的问题让我很迷茫。程序不是你自己写的吗?

如果是别人写的,他想达到什么目的?

只要程序运行成功,目的达到不就行了。在无意义的细节上,不要浪费时间。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 08:21:00 | 显示全部楼层
t2 = play(3);
中由于play需要一个类型的参数,而你传了一个int类型,所以这里将调用够函数B(int i)将int转换为一个临时变量.用程序表达上面的话就是:
t2 = play(3); 等价于t2 = play(B(3));
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-18 08:39:57 | 显示全部楼层
仰望天上的光 发表于 2012-9-18 08:21
t2 = play(3);
中由于play需要一个类型的参数,而你传了一个int类型,所以这里将调用够函数B(int i)将int转 ...

t2 = play(B(3));是这样的,但是在B(3)这个地方应该是只会调用B(int i)构造函数啊,不会产生一个临时对象的,我的疑惑是::在 play(B(3))后 play返回值会存放在一个临时对象里面 为什么??而B t1 = play(2);这种形式的就不会产生临时对象。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 08:48:10 | 显示全部楼层
LZ 好多问题呀  之前的那个 const 的问题 这么多朋友给你回答 难道没有一个满意的吗! 我觉得"仰望天上的光" 的回答就很到位

LZ太纠结了!

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-18 10:14:23 | 显示全部楼层
梦想与现实 发表于 2012-9-18 08:48
LZ 好多问题呀  之前的那个 const 的问题 这么多朋友给你回答 难道没有一个满意的吗! 我觉得"仰望天上的光 ...

我只能说:科学来不了半点虚假,真相永远只有一个!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 10:43:29 | 显示全部楼层
那我就提前预祝LZ 找到科学的真谛 查明真相 惩罚恶人 呵呵 ;P
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-18 15:02:12 | 显示全部楼层
仰望天上的光 发表于 2012-9-17 19:14
B t2;   
t2 = play(3);
等价于

这是我碰到的一道面试题,让当场给出输出结果,而且要说明原因。谢谢  你分析的很透彻!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 15:57:12 | 显示全部楼层
哦,原来是这样,早说出来提问原因大家就不会误会你了。

做面试题是非常难得的锻炼人的机会。

其实楼主可以把更多的面试题分享或提问在这上面,大家都是为了学习,不会因为你有这种难得的机会而对你羡慕嫉妒恨的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-18 21:07:47 | 显示全部楼层
贝壳 发表于 2012-9-18 15:57
哦,原来是这样,早说出来提问原因大家就不会误会你了。

做面试题是非常难得的锻炼人的机会。

是不是面试题真的无所谓,关键是 从这能知道,一些牛的公司 需要的是什么人 不是那种整天敲代码 做项目 就是为了单纯的敲代码 而不知道为什么要这样的人 公司要的是知其所以然的人!牛的公司 总是喜欢问你为什么??不管对与错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-18 21:23:00 | 显示全部楼层
拉登o睡觉 发表于 2012-9-18 21:07
是不是面试题真的无所谓,关键是 从这能知道,一些牛的公司 需要的是什么人 不是那种整天敲代码 做项目 就 ...

你在学校是学生会里的吗?

你有没有发现你一说话总喜欢把话题往官方语言上引?其实这些正式说法,基本的道理,大家都懂的。

而这里只是个论坛,大家聚在这里主要是因为兴趣。放轻松些吧。你看小甲鱼老师的视频,应该发现他很有娱乐精神吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 04:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表