c++问题,求助

Doraemonejd 2018-10-11 04:39:43
#include <iostream>
using namespace std;
char gid = 'A';
class Number
{
private:
int i;
char id;
public:
Number( int x = 0 )
{
i = x;
id = gid++;
cout << "Constructor Number:" << id << i << endl;
}
Number( const Number &x )
{
i = x.i;
id = gid++;
cout << "Copy Number:" << id << i << endl;
}
~Number( ) { cout << "Destructor Number:" << id << i << endl; }
Number operator+( const Number &x );
};
Number Number::operator+( const Number &x )
{
Number result( i + x.i );
return result;
}
int main()
{
Number x(1), y;
y = x + 2;
return 0;
}
输出结果:
Constructor Number:A1 //X(1)
Constructor Number:B0 //Y
Constructor Number:C2 //调用重载的+函数,先构造一个i=2的对象C
Constructor Number:D3 //构造一个i=1+2的对象D ,即result
Copy Number:E3 //对象Y复制D
Destructor Number:D3 //函数返回,先析构D
Destructor Number:E3 //
Destructor Number: C2 //析构c(2)
Destructor Number:E3 //析构y
Destructor Number:A1 //析构x

为什么在析构D3之后会析构E3,而不是析构C2,这样E3不是析构了两次吗
...全文
306 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Doraemonejd 2018-10-17
  • 打赏
  • 举报
回复
引用 3 楼 watersoft 的回复:
函数返回值在栈上,返回时把内部变量result复制了一个副本,第一个E3应该是result的副本,第二个E3是y。这个是可以优化的,编译器直接将result初始化在栈上,函数返回时不用复制副本。

多谢指点,有点明白了,复制函数调用是因为返回result时,在主函数建立的临时对象。但我还有两个问题想请教,1,执行y=x+2时,用函数返回的临时对象赋值y,即y=临时对象,为什么此时不再一次调用复制构造函数?2,书上说临时对象的消失是在表达式结束的时候,那析构临时对象应该是在+函数结束之后,由此应该先析构+函数内部的对象,再析构临时对象,析构顺序是D3,C2,E3,E3,A1,为什么C2的析构会在E3(临时对象)前?
老夏 2018-10-14
  • 打赏
  • 举报
回复
函数返回值在栈上,返回时把内部变量result复制了一个副本,第一个E3应该是result的副本,第二个E3是y。这个是可以优化的,编译器直接将result初始化在栈上,函数返回时不用复制副本。
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
char gid = 'A';
class Number
{
private:
int i;
char id;
public:
Number(int x = 0)
{
i = x;
id = gid++;
cout << "Constructor Number:" << id << i <<" "<< this<< endl;
}
Number(const Number &x)
{
i = x.i;
id = gid++;
cout << "Copy Number:" << id << i << endl;
}
~Number() { cout << "Destructor Number:" << id << i <<" "<<this<< endl; }
Number operator+(const Number &x);
};
Number Number::operator+(const Number &x)
{
Number result(i + x.i);
return result;
}
int main()
{
Number x(1), y;
y = x + 2;
return 0;
}



两个E3是两个对象,
operator+ 这里里面产生一个E3,main里面产生一个E3,对象拷贝了
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
VS2013
十八道胡同 2018-10-14
  • 打赏
  • 举报
回复
Constructor Number:A1
Constructor Number:B0
Constructor Number:C2
Constructor Number:D3
Copy Number:E3
Destructor Number:D3
Destructor Number:E3
Destructor Number:C2
Destructor Number:E3
Destructor Number:A1
请按任意键继续. . .
P_zz 2018-10-13
  • 打赏
  • 举报
回复


我的输出是这样的
JLCode 2018-10-13
  • 打赏
  • 举报
回复
输出同一楼]

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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