C++關鍵字:explicit
阿新 • • 發佈:2022-03-31
轉載自: https://blog.csdn.net/tina_j/article/details/22058281?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_aa&spm=1001.2101.3001.4242.1&utm_relevant_index=3
//…
}
下面兩種寫法比較正常:
String s2 ( 10 ); //OK 分配10個位元組的空字串
String s3 = String ( 10 ); //OK 分配10個位元組的空字串
下面兩種寫法就比較疑惑了:
String s4 = 10; //編譯通過,也是分配10個位元組的空字串
String s5 = ‘a’; //編譯通過,分配int(‘a’)個位元組的空字串
s4 和s5 分別把一個int型和char型,隱式轉換成了分配若干位元組的空字串,容易令人誤解。
為了避免這種錯誤的發生,我們可以宣告顯示的轉換,使用
explicit 關鍵字:
class String {
explicit String ( int n ); //本意是預先分配n個位元組給字串
String ( const char* p );
// 用C風格的字串p作為初始化值
//…
}
加上
explicit,就抑制了String ( int n )的隱式轉換,
下面兩種寫法仍然正確:
String s2 ( 10 ); //OK 分配10個位元組的空字串
String s3 = String ( 10 ); //OK 分配10個位元組的空字串
下面兩種寫法就不允許了:
String s4 = 10; //編譯不通過,不允許隱式的轉換
String s5 = ‘a’; //編譯不通過,不允許隱式的轉換
因此,某些時候,
explicit 可以有效得防止建構函式的隱式轉換帶來的錯誤或者誤解
按照預設規定,只有一個引數的建構函式也定義了一個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示: class String { String ( const char* p ); // 用C風格的字串p作為初始化值 //… } String s1 = “hello”; //OK 隱式轉換,等價於String s1 = String(“hello”); 但是有的時候可能會不需要這種隱式轉換,如下: class String { String ( int n ); //本意是預先分配n個位元組給字串 String ( const char* p ); // 用C風格的字串p作為初始化值
explicit 只對建構函式起作用,用來抑制隱式轉換。如:
class A {
A(int a);
};
int Function(A a);
當呼叫 Function(2) 的時候,2 會隱式轉換為 A 型別。這種情況常常不是程式設計師想要的結果,所以,要避免之,就可以這樣寫:
class A {
explicit A(int a);
};
int Function(A a);
這樣,當呼叫 Function(2) 的時候,編譯器會給出錯誤資訊(除非 Function 有個以 int 為引數的過載形式),這就避免了在程式設計師毫不知情的情況下出現錯誤。
總結:explicit 只對建構函式起作用,用來抑制隱式轉換。