为什么在将对象作为参数传递时调用析构函数而不调用构造函数?
Why destructor is being called but construction not being called when passing object as a parameter?
如果我写一个 class 命名为 Test 并写一个 Test type 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 和 return tt 的析构函数,但没有为它们创建构造函数,但通常我们知道首先将创建构造函数并在完成任务后调用析构函数但是为什么在传递和 returning 任何对象时它是异常的?
按值传递 class 的实例会调用复制构造函数。
如果 class 定义未明确提供复制构造函数,则编译器默认实现复制构造函数(本质上是在调用任何基 classes 的复制构造函数后的成员复制)。此编译器生成的复制构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。
在您的 class 中,如果您按如下方式实现复制构造函数;
Test(const Test &from) : x(from.x)
{
std::cout << "Copy constructor invoked" << std::endl;
}
你会发现确实在调用拷贝构造函数
如果我写一个 class 命名为 Test 并写一个 Test type 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 和 return tt 的析构函数,但没有为它们创建构造函数,但通常我们知道首先将创建构造函数并在完成任务后调用析构函数但是为什么在传递和 returning 任何对象时它是异常的?
按值传递 class 的实例会调用复制构造函数。
如果 class 定义未明确提供复制构造函数,则编译器默认实现复制构造函数(本质上是在调用任何基 classes 的复制构造函数后的成员复制)。此编译器生成的复制构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。
在您的 class 中,如果您按如下方式实现复制构造函数;
Test(const Test &from) : x(from.x)
{
std::cout << "Copy constructor invoked" << std::endl;
}
你会发现确实在调用拷贝构造函数