如果我编写一个名为Test的类并编写一个Test类型的show()函数,例如
#include <iostream>
using namespace std;
class Test{
public:
int x;
Test()
{
cout<<"Empty or Default Constructor"<<endl;
}
Test(int x)
{
cout<<"Valued constructor"<<endl;
}
~Test()
{
cout<<"Destructor"<<x<<endl;
}
Test show(Test obj)
{
Test tt;
tt.x=20;
return tt;
}
};
int main()
{
Test t1,t2(20);
t2.show(t2);
return 0;
}
输出 :
Empty or Default Constructor
Valued constructor
Empty or Default Constructor
Destructor : 20
Destructor : 1988276941
Destructor : 1988276941
Destructor : 1972875622
然后输出显示Test obj的Destructor并返回tt,但没有为它们创建任何构造函数,但通常我们知道首先会创建构造函数,并且在完成任务后将调用destructor,但是为什么在传递和返回任何对象时异常?
通过值传递类的实例将调用复制构造函数。
如果类定义未明确提供副本构造函数,则编译器默认情况下实现副本构造函数(在调用任何基类的副本构造函数之后,基本上是成员复制)。该编译器生成的副本构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。
在您的类中,如果您实现一个复制构造函数,则如下:
Test(const Test &from) : x(from.x)
{
std::cout << "Copy constructor invoked" << std::endl;
}
您会发现确实调用了复制构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句