在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,只能以顯示的方式進行類型轉換。函數
explicit使用注意事項:spa
explicit 關鍵字只能用於類內部的構造函數聲明上;code
explicit 關鍵字做用於單個參數的構造函數。ci
在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,例子:編譯器
(1)未加explicit時的隱式類型轉換it
1. class Circle 2. { 3. public: 4. Circle(double r) : R(r) {} 5. Circle(int x, int y = 0) : X(x), Y(y) {} 6. Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} 7. private: 8. double R; 9. int X; 10. int Y; 11. }; 12. 13. int _tmain(int argc, _TCHAR* argv[]) 14. { 15. //發生隱式類型轉換 16. //編譯器會將它變成以下代碼 17. //tmp = Circle(1.23) 18. //Circle A(tmp); 19. //tmp.~Circle(); 20. Circle A = 1.23; 21. //注意是int型的,調用的是Circle(int x, int y = 0) 22. //它雖然有2個參數,但後一個有默認值,任然能發生隱式轉換 23. Circle B = 123; 24. //這個算隱式調用了拷貝構造函數 25. Circle C = A; 26. 27. return 0; 28. }
(2)加了explicit關鍵字後,可防止以上隱式類型轉換髮生編譯
1. class Circle 2. { 3. public: 4. explicit Circle(double r) : R(r) {} 5. explicit Circle(int x, int y = 0) : X(x), Y(y) {} 6. explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} 7. private: 8. double R; 9. int X; 10. int Y; 11. }; 12. 13. int _tmain(int argc, _TCHAR* argv[]) 14. { 15. //一下3句,都會報錯 16. //Circle A = 1.23; 17. //Circle B = 123; 18. //Circle C = A; 19. 20. //只能用顯示的方式調用了 21. //未給拷貝構造函數加explicit以前能夠這樣 22. Circle A = Circle(1.23); 23. Circle B = Circle(123); 24. Circle C = A; 25. 26. //給拷貝構造函數加了explicit後只能這樣了 27. Circle A(1.23); 28. Circle B(123); 29. Circle C(A); 30. return 0; 31. }