總結首先一句話記住他的使用範圍: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 的析構函式被啟用 在很多情況下,這個轉換是有意的,...