为什么在将对象作为参数传递时调用析构函数而不调用构造

Why destructor is being called but construction not being called when passing object as a parameter?

本文关键字:调用 析构函数 参数传递 对象 为什么      更新时间:2023-10-16

如果我写一个名为Test的,并写一个类似的Test-typeshow()函数

#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 objreturn tt的析构函数,但没有为它们创建构造函数,但通常我们知道首先会创建构造函数,完成任务后会调用析构函数。但为什么在传递和返回任何对象时会出现异常?

通过值传递类的实例会调用复制构造函数。

如果类定义没有显式提供复制构造函数,编译器默认情况下实现复制构造函数(本质上是调用任何基类的复制构造函数后的成员复制)。此编译器生成的副本构造函数不会调用您已实现的其他构造函数之一,因此构造副本不会打印任何内容。但是,完成后将调用析构函数来清理副本。

在您的类中,如果您实现了一个复制构造函数,如下所示;

Test(const Test &from) : x(from.x)
{
    std::cout << "Copy constructor invoked" << std::endl;
}

您会发现复制构造函数确实被调用了。