C++建構函式小結
阿新 • • 發佈:2019-01-08
1.預設構造
class A { public: A() {}; //default建構函式 }; class B { public: B(int _x = 0) : x(_x) {} //default建構函式 private: int x; }; class C { public: C(int _x) : x(_x) {} //不是default建構函式 private: int x; }; int main() { A a; B b; C c;//error:no matching function for call to 'C::C()' return 0; }
2.explicit
將建構函式宣告為explicit,可以阻止他們被用來執行隱式型別轉換(implicit type conversions),但他們仍可被用來執行顯示型別轉換(explicit type conversions)。explicit型別的建構函式能禁止編譯器執行非預期的型別轉換,應儘量使用explicit代替non-explicit。class D { public: explicit D(int _x = 0) : x(_x) {} //default建構函式 private: int x; }; void func(D obj) { //do something... } int main() { D d; func(d); func(123);//error: could not convert '123' from 'int' to 'D' func(D(123));//ok return 0; }
3.copy建構函式
class E { public: E(int _x = 0) : x(_x) {} //default建構函式 E(const E& rhs) //copy建構函式 { x = rhs.x; } E& operator=(const E& rhs) //copy assignment操作符 { x = rhs.x; return *this; } private: int x; }; int main() { E e1; //呼叫default建構函式 E e2(e1); //呼叫copy建構函式 e1 = e2; //呼叫copy assignment操作符 E e3 = e2; //呼叫copy建構函式 return 0; }
copy構造和copy賦值區分:如果有一個新物件被定義(如上文e3),一定會有一個建構函式被呼叫,不可能呼叫賦值操作。若沒有新物件被定義(如上文e1 = e2句),就不會呼叫建構函式,而是賦值操作符“=”被呼叫了。 , copy建構函式定義了一個物件如何passed-by-value(傳值)。passed-by-value以為只調用了copy建構函式,代價較大,以pass-by-reference-to-const代替往往是比較好的選擇。