看書看到了explicit關鍵字,就來做個筆記,講得比較明白,比較淺。
在C++中,我們有時可以將構造函數用作自動類型轉換函數。但這種自動特性並非總是合乎要求的,有時會導致意外的類型轉換,因此,C++新增了關鍵字explicit,用於關閉這種自動特性。即被explicit關鍵字修飾的類構造函數,不能進行自動地隱式類型轉換,只能顯式地進行類型轉換。
注意:只有一個參數的構造函數,或者構造函數有n個參數,但有n-1個參數提供了默認值,這樣的情況才能進行類型轉換。
下面通過一段代碼演示具體應用(無explicit情形):
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 };
上述四種構造函數:
構造函數1沒有參數,無法進行類型轉換!
構造函數2有一個參數,可以進行類型轉換,如:Demo test; test = 12.2;這樣的調用就相當於把12.2隱式轉換為Demo類型。
構造函數3有兩個參數,且無默認值,故無法使用類型轉換!
構造函數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;