我有一個自定義類,它充當一個名爲Integer的int,我想告訴編譯器如何自動將某些類型轉換爲Integer,這樣我就可以避免一次又一次地輸入相同的東西,從內置類型到自定義類的轉換
someCall(Integer(1), Integer(2));
將成爲
someCall(1,2);
我GOOGLE了,但所有我能找到的就是做oposite,鑄造整數爲int我想完成相反。
我有一個自定義類,它充當一個名爲Integer的int,我想告訴編譯器如何自動將某些類型轉換爲Integer,這樣我就可以避免一次又一次地輸入相同的東西,從內置類型到自定義類的轉換
someCall(Integer(1), Integer(2));
將成爲
someCall(1,2);
我GOOGLE了,但所有我能找到的就是做oposite,鑄造整數爲int我想完成相反。
寫一個構造函數int
,如:
class Integer
{
public:
Integer(int);
};
如果該類Integer
有此構造,那麼你可以這樣做:
void f(Integer);
f(Integer(1)); //okay
f(1); //this is also okay!
的解釋是,當你寫f(1)
,那麼Integer
的構造函數會自動調用一個類型爲int
的單參數,並創建一個臨時的動態,然後該臨時被傳遞給函數上!
現在假設你想要做的完全相反,即,通過Integer
類型的對象給一個函數需要int
:
void g(int); //NOTE: this takes int!
Integer intObj(1);
g(intObj); //passing an object of type Integer?
爲了讓上面的代碼工作,你需要的是在類作爲定義一個用戶定義的轉換函數:
class Integer
{
int value;
public:
Integer(int);
operator int() { return value; } //conversion function!
};
因此,當你經過Integer
類型的一個目的是這需要01的功能,然後轉換函數被調用,並且對象隱含轉換爲int
然後傳遞給函數作爲參數。你也可以這樣做:
int i = intObj; //implicitly converts into int
//thanks to the conversion function!
你可以定義Integer中的構造函數,用於你想要隱式轉換的類型。不要讓他們explicit
。
納瓦茲給出了正確的答案。我只想指出一些。 如果轉換操作不是const的,你不能轉換const對象變成
const Integer n(5);
int i = n; // error because non-const conversion operator cannot be called
更好的聲明轉換運算符,
operator int() const {return value;}
+1好點。我喜歡它。 :-) – Nawaz 2011-04-22 14:48:49
理論上,應該轉換爲'INT&'和'const int的&',我認爲。 – Puppy 2011-04-22 14:49:39
納瓦茲你建議的作品,但我有回報(n <2)? 1:IntegerFromACall;這給了我,錯誤:操作數爲?:有不同的類型'int'和'Integer' – 2011-04-22 15:07:05
@Hamza:寫這個:'return(n <2)? 1:(int)IntegerFromACall;'...這將工作! – Nawaz 2011-04-22 15:10:57