C 隱式型別轉換

2021-09-29 12:17:44 字數 2961 閱讀 6399

「可以用單個形參來呼叫的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。」

這裡應該注意的是, 「可以用單個形參進行呼叫」 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。

可以用單個形參來呼叫的建構函式有2種呼叫方式:隱式呼叫和顯示呼叫

以如下類為例

class

a//預設建構函式a(

int a):x

(a)private

:int x;

};

a a(12

);//初始化物件,顯示呼叫建構函式

a b;b=a

(12);

//強制型別轉換,顯示呼叫

###隱式呼叫

a a=12;

//初始化物件,隱式呼叫建構函式

a b;

b=12

;//隱式型別轉換,隱式呼叫建構函式,這裡會在之後詳細描述

用=號進行初始化的時候,會對單個形參的建構函式進行隱式呼叫(沒有被宣告為explicit),如果有對應形參型別的建構函式,則呼叫該建構函式完成初始化,這個過程被稱為隱式型別轉換。

如果建構函式被宣告為explicit,即在建構函式前面加上這個關鍵字,那麼這個建構函式就不能被用於隱式型別轉換。

int

add(

int x,

int y)

add(1,

1)add(

1.1,

1.2)

這裡add函式再呼叫時,形參x,y執行了如下語句,完成了實參傳入形參

int x=1;

int y=1;

/int x=

1.1;

int x=

1.2

這就是乙個用=進行初始化的過程,如果型別不一致,那麼就會進行隱式型別轉換。

如下,完成了隱式型別轉換

class

a//預設建構函式a(

int a):x

(a)private

:int x;};

void

function

(a member)

;function(12

);

在輸入實參與形參型別不同時,由於在實參傳入形參會執行a member=12這個初始化過程,編譯器會執行隱式型別轉換,即呼叫形參物件所對應的建構函式,完成型別轉換。

此時在呼叫function函式時,先執行a member=12;如果有對應建構函式,則呼叫該建構函式,完成實參向形參的型別轉換;

同理,如果在class a中沒有a(int a):x(a){}這個建構函式,

則無法執行a member=12這條語句,即無法完成隱式型別轉換。

如果不允許某個建構函式執行隱式型別轉換,在該建構函式前面加上explicit關鍵字

class

a//預設建構函式

explicita(

int a):x

(a)private

:int x;};

void

function

(a member)

;function(12

);//無法呼叫,沒有相應完成隱式型別轉換的建構函式

a a=12;

//無法完成初始化,理由同上

a a(12)

;//直接呼叫建構函式,完成初始化

同理,如果有如下情況

a a;

a=12

;

a=12是乙個賦值語句,不是初始化,在執行的時候會呼叫賦值操作符的函式(如果使用者沒有自定義,那麼編譯器會自動生成賦值操作符的函式),那麼12就是作為這個"=「函式的輸入實參,在實參對形參初始化的過程完成了隱式型別轉換,然後再執行」="函式。

這個過程也完全說明了

a a(12

);//呼叫建構函式初始化

a a=12;

//隱式型別轉換,尋找沒有被宣告為explicit的建構函式完成初始化

///a a; a=12;

//呼叫預設建構函式初始化,然後執行賦值操作函式,在執行賦值操

//作時進行了隱式型別轉換

下面給出例項,說明在用=號初始化的時候只呼叫了單引數建構函式

classaa

(const a &t):x

(t.x)a(

int y):x

(x) a&

operator=(

const a& t)

private

:int x;};

int main (

)result:

轉換建構函式

預設建構函式

轉換建構函式

copy賦值操作符

拷貝建構函式

這個例子也說明了const a&型別初始化時也會呼叫轉換建構函式,而a&型別不能這樣呼叫。在b=2時呼叫了copy賦值操作符,執行了const a& t = 2呼叫了轉換建構函式,a& t = 2這個語句則無法執行,不能通過編譯。

下面介紹implicit和explicit

函式預設為implicit型別,即預設可以執行隱式型別轉換

如果不想發生隱式型別轉換,則在相應建構函式前面加上explicit關鍵字

C 隱式型別轉換

c 定義了一組內建型別物件之間的轉換標準,在必要時它們被編譯器隱式的應用到物件上。發生隱式型別轉換的情景 1,在混合型別的算術表示式中 轉換原則 轉換為最寬的資料型別。也可叫,算術轉換。int ival 5 double dval 3.14 ival 被提公升為double型別 ival dval ...

C 隱式型別轉換

眾所周知,c 的基本型別中並非完全的對立,部分資料型別之間是可以進行隱式轉換的。所謂隱式轉換,是指不需要使用者干預,編譯器私下進行的型別轉換行為。很多時候使用者可能都不知道進行了哪些轉換。c 物件導向的多型特性,就是通過父類的型別實現對子類的封裝。通過隱式轉換,你可以直接將乙個子類的物件使用父類的型...

C 隱式型別轉換

c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...