讀書筆記 建構函式和複製控制

2021-04-12 21:08:03 字數 1647 閱讀 8417

建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員,如果不自己定義,就將編譯器自動合成。如果類需要只希望派生類使用的特殊建構函式,這樣的建構函式應定義為protected。

派生類的合成預設建構函式的初始化時:

1.先呼叫派生類上一級的預設建構函式初始化

2.然後初始化本壘的資料成員

class bulk_item:public item_base

};隱式呼叫item_base的預設建構函式

向基類建構函式傳遞實參(初始化)

class bulk_itm:public item_base

};乙個類只能初始化直接基類,而不能跨越初始化

派生類的賦值操作符:若派生類自定義了自己的賦值操作符,則該操作必須對基類部分進行顯示賦值

derived &derived::operator=(const derived &rhs)

return *this;

}派生類析構函式不負責撤銷基類物件的成員,物件的撤銷順序與構造順序相反,首先執行派生類析構函式,然後按照繼承層次一次向上呼叫各級類析構函式

如果刪除基類指標,則需要執行基類析構函式並清除基類的成員。如果物件實際上是派生型別,則沒有定義該行動。故基類的析構函式應為虛函式,當析構函式為虛函式時,通過指標呼叫,執行哪個析構函式將返回指標物件型別的不同而不同(析構函式的性質將繼承)

class item_base

};item_base *itemp=new item_base;           //same static and dynamic type

delete itemp;         //ok:destructor for item_base called

itemp=new bulk_item;        //ok:static and dynameic type differ

deleted itemp;         //ok:destructor for bulk_item called

在複製控制成員中,只有析構函式定義為虛函式,其他不應定義為虛函式(構造,賦值) ,因為在每個類中都有自己的複製控制成員.

如果派生類想通過自身型別使用所有的過載版本,則派生類必須衝定義所有過載版本,要麼乙個也不重定義,因為派生類成員會遮蔽積累中相同名字的成員

派生類也可以不用重定義所繼承的每乙個基類版本,可以為過載成員函式名稱而作的using宣告,將該函式的所有過載例項加到派生的作用域

要獲得動態繫結,必須通過基類的引用或指標呼叫虛成員,虛函式在基類和派生類中擁有同一原型。如果不相同,則沒辦法通過基類型別的引用或指標引用派生類函式

class base

;class d1:public base

;class d2:public d1

;base bobj;

d1 d1obj;

d2 d2obj;

base *bp1=&bobj,*bp2=&d1.obj,*bp3=&d2obj;

bp1->fcn();            //ok will call base::fcn at run time

bp2->fcn();      //ok will call base::fcn at run time

bp3->fcn();      //ok will call base::fcn at run time

複製控制 複製建構函式

只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...

複製控制 複製建構函式

只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...

建構函式和複製控制成員

建構函式和複製控制成員不能繼承 即建構函式,析構函式,複製建構函式,賦值操作符 每個類定義自己的建構函式和複製控制成員。像任何類一樣,如果類不定義自己的預設建構函式和複製控制成員,就將使用合成版本。派生類建構函式 派生類的建構函式受繼承關係的影響,每個派生類建構函式除了初始化自己的資料成員之外,還要...