LiYanzu_ 2021-04-29 05:00 采纳率: 33.3%
浏览 35
已采纳

复制构造函数,析构函数问题

#include <iostream>
using namespace std;
class Complex
{
public:
	Complex()  //默认构造函数
	{
		real = 2; imag = 3;
		cout << "Default Constructor called." << endl;
	}
	Complex(float h, float w):real(h), imag(w) //带参数的构造函数
	{
		cout << "Constructor called." << endl;
	}
	Complex(const Complex &b) //复制构造函数
	{
		real = b.real;
		imag = b.imag;
		cout << "copy Constructor called." << endl;
	}
	~Complex()   //析构函数
	{
		cout << "Destructor called." << endl;
	}
	Complex add(Complex c) //复数加法运算
	{
		Complex t;
		t.real = real + c.real;
		t.imag = imag + c.imag;
		return t;
	}
	void display()
	{
		cout << "复数为:" << real << "+" << imag << "i" << endl;
	}
private:
	float real;
	float imag;
};
int main()
{
	Complex c1(3, 6);
	Complex c2(c1);
	Complex c3;
	c3 = c1.add(c2);
	c3.display();
	return 0;
}

主函数从第四行开始,是咋样使用构造函数的呢?

从主函数第四行运行的结果是

copy Constructor called.
Default Constructor called.
copy Constructor called.
Destructor called.
Destructor called.
Destructor called.
复数为:6+12i
Destructor called.
Destructor called.
Destructor called.

为什么先用了复制构造函数,然后用了默认构造函数,然后又用了复制构造函数

然后就开始析构了三次在输出c3.display

然后又析构三次,大佬能解释下吗

展开全部

  • 写回答

5条回答 默认 最新

  • 爱晚乏客游 2021-04-29 05:46
    关注

    为什么我的结果和你的不一样。。。前面几个都好理解,讲一讲add为什么是三个。

    首先是调用了一个拷贝构造函数,将实参c2复制到add的形参c;然后Complex t调用一次默认构造,最后将t返回c3调用一次拷贝构造。所以就是这样了。至于在执行c3.display()前面输出了3此析构函数执行,那是系统调用默认拷贝构造函数的结果,在返回对象和按值传递参数时,要生成临时对象,生成临时对象要调用默认拷贝构造函数(也就是说add这里调用了三次系统默认拷贝构造,一个是形参c,一个是临时变量t,一个是返回t的时候又一个)。下面的三个析构函数才是c3,c2,c1对应的析构函数(析构函数顺序和构造顺序相反,类似穿脱原理,或者你也可以理解为栈,先进后出)

     

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    LiYanzu_ 2021-04-29 06:42

    瞬间懂了,谢谢了哈

    回复
查看更多回答(4条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部