C 關鍵字explicit詳細介紹

2021-09-29 19:36:56 字數 1818 閱讀 5468

總結首先一句話記住他的使用範圍:explicit關鍵字只用於修飾c++中只有乙個引數的建構函式,這就是它的全部作用域,下面一句話說出explicit的作用:用於宣告該類的建構函式(只有乙個引數)是顯示呼叫的。

因為預設情況下,類的建構函式都是implicit的,它可以被隱式轉換。

下面開始舉例:

類定義:

class

student

}

student st

(129);

//正確,定義乙個物件,並初始化num成員

student st =

129;

//正確的,是隱式轉換,也是定義乙個物件,並初始化num成員。

student st = 129; 在c++中,當編譯器編譯到這條指令的時候,會自動執行乙個預設轉換操作:將等號右邊的資料轉換為乙個臨時的左邊物件,然後進行賦值操作,即student st = 129,相當於以下**:

student tmp

(129);

stydent st = tmp;

或者

student st

(129

);

class

student

}student tmp

(129);

//正確

stydent st = tmp;

//錯誤,不支援這種構造方法

上面也已經說過了, explicit關鍵字只對有乙個引數的類建構函式有效, 如果類構造函式引數大於或等於兩個時, 是不會產生隱式轉換的, 所以explicit關鍵字也就無效了.

class

student

}

但是, 也有乙個例外, 就是當除了第乙個引數以外的其他引數都有預設值的時候, explicit關鍵字依然有效, 此時, 當呼叫建構函式時只傳入乙個引數, 等效於只有乙個引數的類建構函式, 例子如下:

class

student

// 使用關鍵字explicit宣告 };

// 下面是呼叫:

student stu1(24

);// 這樣是ok的

student stu2 =10;

// 這樣是不行的, 因為explicit關鍵字取消了隱式轉換 expilcit依然有效

student stu3;

// 這樣是不行的, 因為沒有預設建構函式

stu1 =2;

// 這樣也是不行的, 因為取消了隱式轉換

stu2 =3;

// 這樣也是不行的, 因為取消了隱式轉換

stu3 = stu1;

// 這樣也是不行的, 因為取消了隱式轉換, 除非類實現操作符"="的過載

explicit關鍵字只需用於類內的單引數建構函式前面。由於無引數的建構函式和多引數的建構函式總是顯示呼叫,

這種情況在建構函式前加explicit無意義。

google的c++規範中提到explicit的優點是可以避免不合時宜的型別變換,缺點無。所以google約定所有單引數的建構函式都必須是顯示的,只有極少數情況下拷貝建構函式可以不宣告稱explicit。例如作為其他類的透明包裝器的類。

因為它們禁止編譯器執行非預期(往往也不被期望)的型別轉換。

除非我有乙個好理由允許建構函式被用於隱式型別轉換,否則我會把它宣告為explicit,鼓勵大家遵循相同的政策。

C 的explicit關鍵字

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

C 的explicit關鍵字

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

C 的explicit關鍵字

帶單一引數的建構函式在預設情況下隱含乙個轉換操作符,請看下面的 class c void f 編譯器重新編輯上述例子 如下 c 5 被編譯器轉換成下面這個樣子 c temp 5 例項化乙個臨時物件,c temp 用 賦值 temp.c c temp 的析構函式被啟用 在很多情況下,這個轉換是有意的,...