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