5 型別轉換建構函式

2021-09-29 22:01:02 字數 1253 閱讀 6236

1、型別轉換建構函式的概念

型別轉換建構函式是這樣一種建構函式:它只有乙個引數,而且它不是屬於複製建構函式的建構函式,一般就可以把它看作是轉換建構函式。

2、型別轉換建構函式的作用

3、型別轉換建構函式什麼時候被呼叫?

(1)發生在初始化語句。

上述情況是指在定義乙個類型別的變數且使用乙個物件對其進行顯式初始化時,使用的物件的型別與定義的型別不匹配。

發生過程:編譯器會檢視該型別是否有匹配型別轉換函式可用。如果有,編譯器會建立乙個該類型別的物件,並且則將等號右邊(用於初始化的物件)當做引數傳遞給轉換建構函式來初始化建立的物件。

注意:由於編譯器優化的作用,這種情況編譯器不會建立臨時物件。這種情況其實也可以理解為這個型別轉換建構函式就是乙個普通的建構函式,只是說此時的函式確實符合轉換建構函式的特徵。

(2)發生在賦值語句。

上述情況是指 定義乙個類型別的變數後,對其進行賦值,但是等號右邊的型別與其不匹配時。

發生過程:編譯器會檢視該型別是否有匹配的型別轉換函式可用。如果有,編譯器會建立乙個該型別的臨時物件(也可以叫做臨時變數),並將等號右邊(用於初始化的物件)作為引數傳遞給轉換建構函式來初始化建立的臨時物件,然後將這個臨時變數賦值給等號左邊的變數。

注意:這種情況才是真正的型別轉換函式,它確實通過建立乙個臨時物件,達到了型別轉換的效果。

總之,就是遇見等號兩邊不匹配時(該等號可能是賦值語句,也可能是初始化語句),編譯器會檢視是否存在型別轉換建構函式,如果有,則進行型別裝換,使得程式能夠正常進行。如果沒有,編譯器則會報錯。

3、型別轉換建構函式的舉例

//例1: 隱式轉換

class

complex

complex

(double r,

double i)};

int main (

)//例2:顯式轉換

class

complex

complex

(double r,

double i)};

int main (

)//顯式型別轉換建構函式,不會隱式的呼叫型別轉換建構函式,必須顯式的呼叫

41 型別轉換函式

標準資料型別之間會進行隱式的型別安全轉換,規則如下 char short int unsigned int long unsigned long float double 小轉大 include include using namespace std int main else cout sizeo...

C 筆記5型別轉換

以下 的開頭 include using namespace std c 型別轉換 原始型別轉換,所有情況都是一種寫法,可讀性不高,有可能有潛在的風險 void func int type case 2 default void func2 char c p void main void func ...

類型別轉換(轉換建構函式 型別轉換運算子)

只有乙個引數的建構函式可以作為轉換建構函式,預設情況下會發生隱式轉換,但是如果你對轉換建構函式加上了關鍵字explicit,它就不允許隱式轉換,但是你可以通過static cast等進行強制轉換。而且只允許一步類型別轉換,什麼意思呢?比如乙個類str,它有乙個建構函式,這個建構函式只需要乙個引數,且...