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

#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

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

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

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

 

第一个拷贝构造是add函数,将c2传递给参数c

第二个默认构造是Complex t;

第三个拷贝构造是return t,由于返回变量是Complex,实际会有一个临时返回变量产生,将t传递给它,调用复制构造?或者是c3=c1?

中间三个析构分别是add函数内部变量t,add函数参数c,add函数的返回值

最后三个析构分别是c1,c2,c3

第四行你指那一句?是add函数吗?

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y