在c++中,如果編譯器看到乙個表示式或函式呼叫使用了乙個不合適的型別,它會執行乙個自動型別轉換,將不合適的型別轉換為合適的型別。對於自定義類,可以通過定義該類的建構函式的方法將其它型別轉換為本自定義類;或者使用運算子將本自定義類轉換為其它型別。
對於乙個自定義類,可以為該類定義乙個有乙個引數的建構函式。則編譯器可以將這個函式對應的型別轉換為該自定義類型別。
首先,定義乙個名為myclass的類,該類包含乙個有乙個引數的建構函式。
class myclass
};
接下來定義乙個名為myfunc()
的函式,該函式的引數是自定義
myclass
類的物件。
int myfunc(myclass myclass)
函式的返回值是myclass
類物件的成員變數i。
最後,在main()函式中,執行如下**
int result = myfunc(1);
整型變數result
的值是1
。因為myfunc()
函式的引數是
myclass
類的物件,當
myfunc()
函式的引數是
int型別時,編譯器檢查是否可以從
int型別轉換為
myclass
型別,結果發現可以通過
myclass
的建構函式
myclass(int ii)
這種方式實現轉換。所以,在以上**中,
myclass::myclass(int ii)
函式首先被呼叫,編譯器將
int型別轉換為
myclass
型別之後,再呼叫
myfunc(myclass myclass)
函式將myclass
類物件的成員變數
i的值作為返回值返回。
如果需要禁止這種通過建構函式的自動轉換,則需要使用explicit關鍵字對
myclass
類的建構函式進行修飾。
class myclass
};
此時,在main()
函式中,如下**
int result = myfunc(1);
在編譯時就會報錯,其報錯資訊為「
error c2664:
「int myfunc(myclass)」:
無法將引數
1 從「
int」轉換為「
myclass
」」。此時就無法再通過建構函式實現型別的自動轉換了。
此時,只需將呼叫myfunc()函式的**改為如下即可
int result = myfunc(myclass(1));
仍以「1
定義建構函式將其它型別轉換為本型別」中提到的
myclass
類為例,可以為該類定義乙個運算子,通過該運算子,將該型別的物件轉換為其它型別。
class myclass
operator int() //運算子過載
};
通過operator
關鍵字過載了運算子,但是該運算子過載的方式比較特別,因為沒有指定乙個返回型別。其實,使用本方法過載的運算子返回型別就是運算子的名字。在
myclass
類中過載的運算子的返回值是
int,通過該過載的運算子,可以將
myclass
型別轉換為
int型別。
接下來定義乙個名為myfunc2()的函式,該函式的引數是
int型別。
int myfunc2(int i)
在main()
函式中,有如下**
int result2 = myfunc2(myclass(1));
此時,雖然myfunc2()函式的形參型別是
int,而實參型別是
myclass
,但是由於為
myclass
類過載了自動型別轉換運算子,所以該**能夠正常執行,
result2
的值是1
。
c 過載自動型別轉換
c 裡有一些隱式型別轉換,比如 double附值給int,內容會被截斷 int和double型別的值進行運算,int自動轉換為double型等。所謂過載自動型別轉換,就是使用者自己定義類的自動轉換方式。我越來越懶了,直接貼 吧。operator type 可以過載多個 operator type1 ...
自動型別轉換
1 建構函式轉換 如果定義乙個建構函式,這個建構函式能把乙個型別的物件 或引用 作為它的單個引數,那麼這個建構函式允許編譯器執行自動型別轉換。class one class two void fun two int main 從上面的 我們可以看到通過建構函式可以 輕易的把乙個型別的變數轉換為另乙個...
c語言的自動型別轉換
2009 12 16 09 53 1292人閱讀 收藏舉報 自動轉換遵循以下規則 1 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。2 轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。a.若兩種型別的位元組數不同,轉換...