为什么要调用析构函数,但是在将对象作为参数传递时不会调用构造?

时间:2015-02-10 08:28:58

标签: c++ constructor destructor

如果我写一个名为测试并编写测试类型 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

然后输出显示测试obj 返回tt 的析构函数,但是没有为它们创建构造函数但通常我们知道首先会创建构造函数并在完成任务之后将调用析构函数,但为什么在传递和返回任何对象时它是特殊的?

1 个答案:

答案 0 :(得分:1)

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

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

在您的课程中,如果您实现了如下的复制构造函数;

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

你会发现确实正在调用复制构造函数。