2015-02-10 124 views
-9

如果我写像命名测试,写试验类型显示()函数为什么要调用析构函数,但在将对象作为参数传递时不会调用构造?

#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的析构和return tt但是没有为它们创建构造函数,但通常我们知道fir stly构造函数将被创建,在完成任务析构函数后会被调用,但为什么在传递和返回任何对象时它是例外的?

+0

在“Test tt;”中Test的默认构造函数将被调用(如果存在),但由于您未提供Test的代码,因此无法回答。另外,请注意,obj完全不用,所以编译器可能会优化它。 – 2015-02-10 08:31:00

+2

完整编写代码并显示您正在打印的位置。 – 2015-02-10 08:33:05

+0

@DanielDaranas,请问现在可以告诉我,为什么构造函数不是在调用Test obj并返回tt。 – 2015-02-10 09:31:04

回答

1

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

如果类定义没有明确提供,编译器默认实现复制构造函数(实质上是调用任何基类的复制构造函数后的成员复制)。这个编译器生成的拷贝构造函数不会调用你已经实现的其他构造函数,所以构建拷贝不会打印任何东西。但是,完成后将调用析构函数来清理副本。

在你的类中,如果你实现了一个拷贝构造函数,如下:

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

你会发现拷贝构造函数确实被调用。

相关问题