#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