C++中的explicit關鍵字
阿新 • • 發佈:2018-12-12
在C++中,explicit關鍵字用來修飾類的建構函式,被修飾的建構函式的類,不能發生相應的隱式型別轉換,只能以顯示的方式進行型別轉換。 例如:不加explicit的隱式轉換:
class Circle { public: Circle(double r) : R(r) {} Circle(int x, int y = 0) : X(x), Y(y) {} Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} private: double R; int X; int Y; }; int _tmain(int argc, _TCHAR* argv[]) { //發生隱式型別轉換 //編譯器會將它變成如下程式碼 //tmp = Circle(1.23) //Circle A(tmp); //tmp.~Circle(); Circle A = 1.23; //注意是int型的,呼叫的是Circle(int x, int y = 0) //它雖然有2個引數,但後一個有預設值,任然能發生隱式轉換 Circle B = 123; //這個算隱式呼叫了拷貝建構函式 Circle C = A; return 0; }
一般寫程式碼,為了方便閱讀,都是用的顯式轉換,但是為了避免人為的隱式轉換,所以加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. }