C++中explicit關鍵字的使用(轉)
阿新 • • 發佈:2020-07-09
看書看到了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;