explicit
class A{public: A(); //default構造函數};class C{public: explicit C(int x); //不是default構造函數};構造函數被聲明為explicit,這可阻止它們被用來執行隱式類型轉換,但它們仍可被用來進行顯式類型轉換:
void doSomething(C cObject);C cObj1;doSomething(cObj1); //okC cObj2(28);doSomething(28); //WRONG 該函數接受一個C,而不是int,而int和C之間沒有隱式轉換doSomething(C(28)); //OK,使用C構造函數將int顯式轉換被聲明為explicit的構造函數通常比其non-explicit更受歡迎,因為它們禁止編譯器執行非預期的類型轉換。
copy構造函數
copy構造函數被用來“以同型對象初始化自我對象”,copy assignment操作符被用來“從另一同型對象中拷貝其值到自我對象”
class Widget{public: Widget(); //default構造函數 Widget(const Widget& rhs); //copy構造函數 Widget& Operator=(const Widget& rhs); //copy assignment操作符 ...};Widget W1; //調用default構造函數Widget W2(W1); //調用copy構造函數W1=W2; //調用copy assignment操作符Widget W3=W2; //賦值符號“=”也可用來調用copy構造函數copy構造函數是一個尤其重要的函數,因為它定義一個對象如何passed by value(以值傳遞)
bool hasAcceptableQuality(Widget w);...Widget aWidget;if(hasAcceptableQuality(aWidget)){ ...}參數w是以by value方式傳遞給hasAcceptableQuality,所以在上述調用中aWidget被復制到w體。這個復制動作是由Widget的copy構造函數完成。passed by value意味著調用copy構造函數。
以by value傳遞用戶自定義類型通常是bad idea,pass by reference to const往往是比較好的選擇
新聞熱點
疑難解答
圖片精選