看書看到了explicit關鍵字,就來作個筆記,講得比較明白,比較淺。函數
在C++中,咱們有時能夠將構造函數用做自動類型轉換函數。但這種自動特性並不是老是合乎要求的,有時會致使意外的類型轉換,所以,C++新增了關鍵字explicit,用於關閉這種自動特性。即被explicit關鍵字修飾的類構造函數,不能進行自動地隱式類型轉換,只能顯式地進行類型轉換。spa
注意:只有一個參數的構造函數,或者構造函數有n個參數,但有n-1個參數提供了默認值,這樣的狀況才能進行類型轉換。code
下面經過一段代碼演示具體應用(無explicit情形):blog
1 /* 示例代碼1 */ 2 class Demo 3 { 4 public: 5 Demo(); /* 構造函數1 */ 6 Demo(double a); /* 示例代碼2 */ 7 Demo(int a,double b); /* 示例代碼3 */ 8 Demo(int a,int b=10,double c=1.6); /* 示例代碼4 */ 9 ~Demo(); 10 void Func(void); 11 12 private: 13 int value1; 14 int value2; 15 };
上述四種構造函數:ci
構造函數1沒有參數,沒法進行類型轉換!it
構造函數2有一個參數,能夠進行類型轉換,如:Demo test; test = 12.2;這樣的調用就至關於把12.2隱式轉換爲Demo類型。class
構造函數3有兩個參數,且無默認值,故沒法使用類型轉換!test
構造函數4有3個參數,其中兩個參數有默認值,故能夠進行隱式轉換,如:Demo test;test = 10; 。構造函數
下面講述使用了關鍵字explicit的狀況:類型轉換
1 1 /* 示例代碼2 */ 2 2 class Demo 3 3 { 4 4 public: 5 5 Demo(); /* 構造函數1 */ 6 6 explicit Demo(double a); /* 示例代碼2 */ 7 7 Demo(int a,double b); /* 示例代碼3 */ 8 8 9 9 ~Demo(); 10 10 void Func(void); 11 11 12 12 private: 13 13 int value1; 14 14 int value2; 15 15 };
在上述構造函數2中,因爲使用了explicit關鍵字,則沒法進行隱式轉換。即:Demo test;test = 12.2;是無效的!可是咱們能夠進行顯示類型轉換,如:
Demo test;
test = Demo(12.2); 或者
test = (Demo)12.2;