2015-02-11 76 views
2
#include<iostream> 

using namespace std; 

class Test 
{ 
private: 
    int x; 
public: 
    Test(int i) 
    { 
     cout<<"Conversion constructor called..."<<endl; 
     x = i; 
    } 
    ~Test() 
    { 
     cout<<"Destructor called..."<<endl; 
    } 
    void show() 
    { 
     cout<<" x = "<<x<<endl; 
    } 
}; 

int main() 
{ 
    Test t(20); 
    t.show(); 
    t = 30; 
    t.show(); 

    return 0; 
} 

輸出:轉換構造澄清

Conversion constructor called... 
x = 20 
Conversion constructor called... 
Destructor called... 
x = 30 
Destructor called... 

當我在做T = 30,爲什麼它在調用構造函數和析構函數? 請解釋。提前多謝。

回答

1

當您編寫t = 30時,編譯器會創建一個臨時Test變量,該變量使用轉換構造函數創建。在將t設置爲等於該臨時變量之後,臨時變量將被銷燬,調用析構函數。

+0

@paddy

Test & operator=(int i) {x = i;} 

在這種情況下,轉讓可以直接使用此,相當於:

你可以通過提供一個賦值操作符避免這種默認的賦值運算符是禁止複製來自另一個'Test'的賦值,而不是來自任意類型。 – 2015-02-11 17:11:55

1

由於t已被定義,因此無法通過轉換構造函數進行初始化。

相反,它會創建一個臨時對象Test,調用operator =,然後將其刪除。

1

「爲什麼它調用構造函數和析構函數?

因爲有一個(隱含的)臨時的Test構建的實例,分配給t和分配後銷燬。

3

=沒有超載,可用於直接從int值中指定值。您的轉換構造函數允許將30轉換爲Test對象,然後可以使用隱式生成的複製構造函數(複製每個成員)來分配該對象。因此,您的任務相當於

t = Test(30); 

創建並銷燬要分配的臨時對象。到

t.operator=(30); 
+0

感謝邁克,我相應地更新了 – paddy 2015-02-11 17:11:28