2013-06-20 34 views
0

構造函數轉換如何工作?構造函數轉換如何在C++中工作?

#include <iostream> 
using namespace::std; 

class One { 
public: 
    One() { cout<<"One"<<endl;} 
}; 

class Two { 
public: 
    Two(const One&) {cout<<"Two(const One&)"<<endl;} 
}; 

void f(Two) {cout<<"f(Two)"<<endl;} 

int main() { 
    One one; 
    f(one); 
} 

產生輸出

One 
Two(const One&) 
f(Two) 

回答

3

任何可以用一個參數調用的構造函數都被認爲是implicit conversion constructor。這包括簡單的1個參數的情況以及默認參數的使用。

在任何需要X並提供Y的上下文中考慮此轉換,並且Y具有這種隱式轉換可能性。請注意,大量其他內置轉換也可以混合使用(例如調整常量,積分和fp促銷,轉換等)。規則是最多允許一個「用戶定義」隱式轉換混合。

在某些情況下,這可能是相當令人驚訝的,所以一般的建議是使任何這樣的電影explicit。該關鍵字使轉換成爲可能,但不是隱含的:您必須使用T()語法來強制轉換。

舉一個例子,考慮std::vector有一個ctor採取size_t,設置初始大小。它是明確的 - 否則你的foo(vector<double> const&)函數可能被錯誤地用foo調用(42)。

0

這是正確的結果。由於constructor不是explicit - 隱式轉換工作(此處One已隱式轉換爲Two)。

one被創建,然後當傳遞到f轉換爲Two

0

編譯器必須在堆棧上創建Two實例副本。當你調用f()的參數是類One(或任何其他)的對象的參數時,編譯器會查找類Two的定義,並嘗試查找以One(或任何其他)對象(或引用)作爲參數的構造函數。當找到這樣的構造函數時,它使用它構造對象。它被稱爲隱含的,因爲編譯器沒有你的干涉。

class Foo { 
public: 
    Foo(int number) {cout<<"Foo(int number)"<<endl;} 
}; 

void f(Foo) {cout<<"f(Foo)"<<endl;} 

int main() { 
    f(24); 
} ///:~ 

輸出將是: 美孚(INT數) F(美孚)

0

什麼Two(const One&) {cout<<"Two(const One&)"<<endl;}構造的意思是,你可在任何時候以構建Two值 - 含蓄 - 從One。當你打電話給f(one)時,它想要一個Two參數,它的參數是One,所以編譯器把2和2放在一起,並說:「我將從One暫時撥出Two並完成對f()的呼叫」...每個人都會很高興。歡呼!