对象作为参数

zhqyzhqychn 2010-04-21 12:45:32


class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
B( const B & para)
{
cout<<"copy destructor "<<endl;
}
B & operator = (const B ¶)
{
cout<<" operator ="<<endl;
return *this ;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i) //B(int) works as a converter ( int -> instance of B)
{
cout<<"constructed by parameter " << data <<endl;
}
private:
int data;
};

B Play( B b)
{

return b ;
}


B t1 = play(B(5));
play(5);
B t1 = play(5);
通过打印结果,上面三种调用方式,结果都是只有两个对象被构造

B t1 = play(B(5));
拿这个当例子,t1是一个对象,函数里那个形参 b是一个对象,可是其他的临时对象呢,怎么会没有了呢,比如B(5)不会产生临时对象吗?

还有
play(5);
B t1 = play(5); //这两个为什么都是两个呢,实在想不明白,第二个应该比第一个多一个呀


...全文
128 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhqyzhqychn 2010-04-22
  • 打赏
  • 举报
回复

可是 B t1 = play(B(5));总共产生了两个对象呢,t1是一个,函数里那个参数b是一个,你说的第一个临时对象就是参数b吗,还是被优化掉了?
[Quote=引用 9 楼 julykey 的回复:]
play(5);
和play(B(5));
传参的时候也是一样的没有临时对象产生吗,我以为得先产生个临时对象然后用临时的对象去构造形参b呢,
[/Quote]
play(5);首先通过隐式调用构造函数,产生了一个临时对象,作为play()的参数。return b;后有通过拷贝构造函数产生了一个临时对象。这条语句执行完后,这两个临时对象都被析构。所以这里会析构两次。
而B t1 = pla……
[/Quote]
liu3xing3long 2010-04-21
  • 打赏
  • 举报
回复
B t1 = play(B(5));
拿这个当例子,t1是一个对象,函数里那个形参 b是一个对象,可是其他的临时对象呢,怎么会没有了呢,比如B(5)不会产生临时对象吗?

先是B(5)构造一次;
然后return之后对t1拷贝构造一次;
pengzhixi 2010-04-21
  • 打赏
  • 举报
回复
有一种叫做优化,你这样是可以将临时对象优化掉的。如果是B t1; t1 = play(B(5));你再看看有没有临时对象。
编程-鸟人-_-- 2010-04-21
  • 打赏
  • 举报
回复
不太明白你表示的问题。

好像是说‘显式’和‘隐式’的区别!!!
zhqyzhqychn 2010-04-21
  • 打赏
  • 举报
回复
标题写错了,不知道怎么修改。。。
Julykey 2010-04-21
  • 打赏
  • 举报
回复
play(5);
和play(B(5));
传参的时候也是一样的没有临时对象产生吗,我以为得先产生个临时对象然后用临时的对象去构造形参b呢,
[/Quote]
play(5);首先通过隐式调用构造函数,产生了一个临时对象,作为play()的参数。return b;后有通过拷贝构造函数产生了一个临时对象。这条语句执行完后,这两个临时对象都被析构。所以这里会析构两次。
而B t1 = play(5);和B t1 = play(B(5));是一样的,无非是一个隐式调用构造函数,一个显式调用。return b;后的临时对象被对象t1的拷贝构造函数给优化了。
selooloo 2010-04-21
  • 打赏
  • 举报
回复
有临时对象产生啊,共产生两个临时对象,比如play(B(5));先调用B(5)产生一个临时对象,然后接收return值的时候会产生一个临时对象,调用构造函数
play(5);和play(B(5));效果一样,因为play(5);会进行一个隐式类型转换,默认调用B(int i):data(i)
zhqyzhqychn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]
B t1 = play(B(5));
//B(5)就只有这个临时对象,本来返回b的时候是需要再构造一个临时对象的,但是B t1 = play(B(5));
可以通过拷贝构造函数直接优化掉。
[/Quote]

play(5);
和play(B(5));
传参的时候也是一样的没有临时对象产生吗,我以为得先产生个临时对象然后用临时的对象去构造形参b呢,
zhqyzhqychn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]
B t1 = play(B(5));
//B(5)就只有这个临时对象,本来返回b的时候是需要再构造一个临时对象的,但是B t1 = play(B(5));
可以通过拷贝构造函数直接优化掉。
[/Quote]

play(5);
和play(B(5));
传参的时候也是一样的没有临时对象产生吗,我以为得先产生个临时对象然后用临时的对象去构造形参b呢,
pengzhixi 2010-04-21
  • 打赏
  • 举报
回复
B t1 = play(B(5));
//B(5)就只有这个临时对象,本来返回b的时候是需要再构造一个临时对象的,但是B t1 = play(B(5));
可以通过拷贝构造函数直接优化掉。

64,639

社区成员

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

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