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 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面...