2010-04-20 43 views
1

採取以下類:構造類型強制在C++

 class mytype { 
     double num; 
    public: 
     mytype(int a) { 
      num = sqrt(a); 
     } 
     void print() { 
      cout << num; 
     } 
    } 

說有是取MYTYPE的方法:

void foo(mytype a) { 
    a.print(); 
} 

它是合法的C++(或者是有沒有辦法實現這個)調用foo(4),這將(理論上)輸出2?從我可以收集到的,你可以重載用戶定義類的類型轉換,但不能轉換成。構造函數可以以符合標準的方式執行此操作(當然,假設構造函數不明確)。希望有一種方法來到底有沒有這個法律:

int a; 
cin >> a; 
foo(a); 

注:這是很明顯不是實際的問題,而只是張貼目的的例子。由於繼承和其他程序特定的問題,我不能僅僅重載函數。

回答

2

是的。實際上,如果您的班級聲明爲#include d,則這是默認動作。

要禁止這樣做,您的類構造函數必須聲明爲explicit。請注意,只有帶一個參數的構造函數(或者第一個參數後面的每個參數都有默認值的構造函數)纔可以使用類型強制。

除非特別需要,否則制定所有構造函數explicit被認爲是良好的做法。請注意,即使你的構造明確的,你仍然可以做一個匿名的轉換:foo(mytype(4));

+0

謝謝。在這種情況下,需要此行爲。如果foo接受了mytype的超類,這也能起作用嗎?另外,爲什麼必須是4.0? – 2010-04-20 23:48:08

+0

我認爲rlbond沒有注意到構造函數mytype(int a)接受一個int參數,構造函數在內部將其轉換爲double。 – 2010-04-21 02:13:06

+0

@Windows程序員:你是對​​的。然而,顯然這種轉換對於內置插件(但不適用於類)是有效的。 – rlbond 2010-04-21 05:25:15

1

您可以從本地類型定義轉換爲這樣的構造,以及轉換爲原生類型,如operator int()

唯一的限制是您無法重新定義之間的原生類型,或(重新)定義僅對本機類型操作的操作符,或者在它們的操作數類之外定義某些操作符。