C 關鍵字之explicit

2021-08-11 15:18:38 字數 1551 閱讀 1248

explicit翻譯過來就是「顯式」!

顧名思義:

當我們用該關鍵字修飾該乙個類的建構函式時,該類物件:

1、不允許通過隱式型別轉換得到;

2、只能通過顯示呼叫建構函式獲得;

通過**例項來看:

首先,我們定義兩個類:

a類建構函式不用explicit修飾

a_e類建構函式用explicit修飾;

class a;

};a::a(int a)

class a_e;

};a_e::a_e(int a)

現在參考以下兩種情況(它們都會嘗試進行隱式轉換):

一、

a a1=256;//編譯器通過隱式轉換成功編譯執行
a_e a2=256;//explicit修飾,無法進行隱式轉換,編譯失敗

注:這種情況是:

1、用int型別的值來對自定義型別a型別的物件進行初始化,由於型別不匹配,編譯的時候,編譯器執行隱式轉換

(i、先將int型別的256轉換成a型別;

ii、然後呼叫

copy建構函式初始化a1。),編譯通過;

2、用int型別的值來對a_e

型別的物件進行初始化,而由於a_e型別建構函式由explicit修飾,編譯器無法對其進行隱式轉換,導致編譯失敗;

二、

void do(a a1){

#do something

}do(256);//編譯器通過隱式轉換成功編譯執行

void do_e(a_e a2){

#do something

}do_e(256);//explicit修飾,無法進行隱式轉換,編譯失敗

注:這裡情況是:

1、do函式需要乙個a型別的形參,我們卻傳了乙個int型別的實參256給它,由於型別不匹配,編譯器編譯的時候將進行隱式轉換,編譯通過;

2、而do_e函式情況類似,而由於它需要的是a_e型別引數,而a_e型別建構函式由explicit修飾,編譯器無法進行隱式轉換,導致編譯失敗;

總結:當定義乙個類的時候,將其建構函式使用explicit關鍵字修飾,可以阻止編譯器執行非預期(通常也是不被期望)的型別轉換。因此,我們應當養成使用explicit關鍵字的良好習慣。除非有需求的刻意允許隱式轉換,否則建議一律將建構函式宣告為explicit,防止編譯器自動執行隱式轉換導致不可知錯誤。

C 之「關鍵字explicit」

explicit 1.引入 在c 中,我們有時可以將建構函式用作自動型別轉換函式。但這種自動特性並非總是合乎要求的,有時會導致意外的型別轉換,因此,c 新增了關鍵字 explicit 用於關閉這種自動特性。即被 explicit 關鍵字修飾的類建構函式,不能進行自動地隱式型別轉換,只能顯式地進行型別...

C 關鍵字之explicit

explicit關鍵字的作用就是防止類建構函式的隱式自動轉換。explicit只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 在c 中,如果的建構函式只有...

C 的explicit關鍵字

c 的explicit關鍵字 c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面...