2014-10-17 171 views
2

有一些代碼如下:一類變量分配值

class A{ 
    private : 
     int a, b; 
    public : 
     A(int x):a(x),b(a*a){} 
    int getA(){ 
     return a; 
    } 
    int getB(){ 
     return b; 
    } 
}; 

int main(){ 
    A a=13; 
    printf("%d %d\n", a.getA(), a.getB()); 
    return 0; 
} 

A a=13,我不明白它是如何調用構造函數,爲什麼? 我認爲沒有關於演員的任何定義,並且不會被編譯,但它運行良好並且被稱爲構造函數。

+4

如果你不想隱式轉換,定義構造函數'explicit'。 – yizzlez 2014-10-17 15:58:31

回答

2

看來你是不知道

如果你願意,你可以通過構造函數明確防止隱式轉換轉換構造函數。 A 轉換構造函數是一個構造函數,它只接受一個參數並構造該類的一個對象。它的工作原理類似於從某種類型到類的轉換,因此名稱爲轉換構造函數

隱式轉換,我相信這是令你困惑的事,當編譯器看到兩種不同的類型並試圖通過查找可能的轉換來使它們兼容時發生。

正如你所看到的,隱式轉換會引起相當多的混淆(一個int也可以是A??)。因此,你應該小心的在你的班上轉換構造並在必要時使用explicit關鍵字。

explicit A(int i); 

當您指定一個轉換構造函數explicit,這告訴編譯器這種類型執行任何隱式轉換。當發生這種情況時,您只能使用諸如static_cast<int>(a);之類的轉換進行轉換。

謝謝您的閱讀。

6

這就是所謂的隱式聲明。當你寫A a=13;,你的編譯器是足夠聰明的認識到,你真正的意思是A a(13);因爲你宣佈一個構造函數一個int作爲參數。如果你不希望這樣的事情發生,把一個explicit關鍵字的構造函數之前,然後除非你寫A a(13);而不是A a=13;你會得到編譯器錯誤。

+0

太好了,謝謝。 +1 – 2014-10-17 17:36:25

5

採用單個參數的非顯式構造函數可用作轉換構造函數,以隱式地將參數類型轉換爲類類型。

這樣的構造函數是用來轉換13鍵入A

explicit A(int x):a(x),b(a*a){} 

仍然可用於顯式轉換:

A a1(13);  // OK: explicit conversion 
A a2 = A(13); // OK: explicit conversion 
A a3 = 13; // Error: implicit conversion not allowed via explicit constructor