2015-02-10 135 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; 
} 

你會發現拷貝構造函數確實被調用。

相關問題