C 自動型別轉換

2021-08-11 14:24:09 字數 2226 閱讀 3054

在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.若兩種型別的位元組數不同,轉換...