關鍵字只能用在類構造函數。它的做用是不能進行隱式轉換。函數
1 class gxgExplicit //沒有關鍵字explicit的類 2 3 { 4 5 public: 6 7 int _size; 8 9 gxgExplicit(int size) 10 11 { 12 13 _size = size; 14 15 } 16 17 };
下面是調用spa
gxgExplicit gE1(24); //這樣是沒有問題的 gxgExplicit gE2 = 1; //這樣也是沒有問題的 gxgExplicit gE3; //這樣是不行的,沒有默認構造函數 gE1 = 2; //這樣也是沒有問題的 gE2 = 3; //這樣也是沒有問題的 gE2 = gE1; //這樣也是沒有問題的
可是假如gxgExplicit修改成Stack,咱們的_size表明的是堆棧的大小,那麼調用的第二句就顯得不三不四,並且容易讓人疑惑。這並非可讓代碼閱讀者明白和接受的形式,雖然它是合法的(編譯器能夠經過編譯)。這是由於編譯器默認狀況下有隱式轉換的功能,你輸入gE2 = 1就編譯成同第一句相同的結果。因此,explicit就派上了用場。修改代碼爲:code
1 class gxgExplicit 2 3 { 4 5 public: 6 7 int _size; 8 9 explicit gxgExplicit(int size) 10 11 { 12 13 _size = size; 14 15 } 16 17 };
繼續上面的調用:blog
gxgExplicit gE1(24); //這樣是沒有問題的 gxgExplicit gE2 = 1; //這樣是不行的,關鍵字取消了隱式轉換 gxgExplicit gE3; //這樣是不行的,沒有默認構造函數 gE1 = 2; //這樣是不行的,關鍵字取消了隱式轉換 gE2 = 3; //這樣是不行的,關鍵字取消了隱式轉換 gE2 = gE1; //這樣是不行的,關鍵字取消了隱式轉換,除非類實現操做符「=」的重載。
這是編譯器(vs2005)顯示:cannot convert from 'int' to 'gxgExplicit'。ci
從這裏也就看出這個關鍵字的做用是將編譯器隱式轉換的功能給屏蔽掉。編譯器
MSDN上有一個注意點描述了下面的事實,當構造函數參數超過兩個時自動取消隱式轉換。例如it
1 class gxgExplicit 2 3 { 4 5 private: 6 7 int _size; 8 9 int _age; 10 11 public: 12 13 explicit gxgExplicit(int age, int size) 14 15 { 16 17 _age = age; 18 19 _size = size; 20 21 } 22 23 };
這是有沒有關鍵字效果是同樣的。那就是至關於有這個關鍵字。編譯
可是另一種狀況例外:其中只有一個必須輸入的參數,其他的爲有默認值的參數。class
1 class gxgExplicit 2 3 { 4 5 private: 6 7 int _size; 8 9 int _age; 10 11 public: 12 13 explicit gxgExplicit(int age, int size = 0) 14 15 { 16 17 _age = age; 18 19 _size = size; 20 21 } 22 23 };