編譯器會自動生成一些公有的成員函式——特殊成員函式。
1、預設建構函式
提供建構函式的動機之一是確保物件總能被正確地初始化。如果類包含指標成員,則必須初始化這些成員。最好提供乙個顯式預設建構函式,將所有的類資料成員都初始化為合理的值。
如果定義了某種建構函式,編譯器將不會定義預設建構函式。如果沒有定義任何建構函式,編譯器將定義預設建構函式。
預設建構函式要麼沒有引數,要麼所有的引數都有預設值。
2、複製建構函式
複製建構函式接受其所屬類的物件作為引數。例如,star類的賦值建構函式的原型如下:
star(const star &);
在下述情況下,將使用複製建構函式:
將新物件初始化為乙個同類物件;
按值將物件傳遞給函式;
函式按值返回物件;
編譯器生成臨時物件;
3、賦值運算子
初始化和賦值不是一回事;
star sirius;
star alpha = sirius; //initialization 初始化
star dogstar;
dogstar = sirius; //assignment 賦值
預設的賦值運算子用於處理同類物件之間的賦值;
如果需要顯式定義複製建構函式,基於相同的原因,也需要顯式定義賦值運算子。
1、建構函式
建構函式不同於其他類方法,因為它建立新的物件。而其他類方法知識被現有的物件呼叫。這是建構函式不被繼承的原因之一。
2、析構函式
一定要定義顯式析構函式來釋放類建構函式使用new分配的所有記憶體,並完成類物件所需的任何特殊的清理工作。對於基類,即使它不需要析構函式,也應提供乙個虛析構函式。
3、轉換
4、按值傳遞物件與傳遞引用
編寫使用物件作為引數的函式時,應將引數宣告為const引用。這樣可以提高程式執行的效率。
按引用傳遞物件的另外乙個原因是,在繼承使用虛函式時,被定義為接受基類引用引數的函式可以接受派生類。
5、返回物件和返回引用
返回物件需要生成臨時副本,這就要呼叫複製建構函式來生成副本和呼叫析構函式來刪除副本。
返回引用可以節約記憶體空間和時間,但是並不總是要返回引用。
6、使用const
使用const來確保方法不修改呼叫它的物件。
在程式中使用繼承,有很多問題需要注意。
1、is-a關係
必須是is-a關係,無需進行顯式型別轉換,基類指標就可以指向派生類物件,基類引用可以引用派生類物件。
2、什麼不能被繼承
建構函式、析構函式、賦值運算子;都不可以;
3、賦值運算子
如果編譯器發現程式將乙個物件賦給同乙個類的另乙個物件,它將自動為這個類提供乙個賦值運算子。
4、私有成員與保護成員
對於派生類而言,保護成員類似於公有成員。
但對於外部而言,保護成員與私有成員類似。
派生類可以直接訪問基類的保護成員,但只能通過基類的成員函式來訪問私有成員。
5、虛方法
設計基類時,必須確定是否將類方法宣告為虛的。如果希望派生類能夠重新定義方法,則應在基類中將方法定義為虛的。這樣可以啟動動態聯編。
6、析構函式
基類的析構函式應當是虛的。這樣,當通過通過物件的基類指標或引用來刪除派生物件時,程式將首先呼叫派生類的析構函式,然後呼叫基類的析構函式,而不僅僅是呼叫基類的析構函式。
7、友元函式
友元函式並非類成員,因此不能被繼承。
8、有關使用基類方法的說明
以公有方式派生的類的物件可以通過多種方式來使用基類的方法。
派生類物件自動使用繼承而來的基類方法,如果派生類沒有重新定義該方法;
派生類的建構函式自動呼叫基類的建構函式;
派生類的建構函式自動呼叫基類的預設建構函式,如果沒有在成員初始化列表中指定其他建構函式;
派生類建構函式顯式地呼叫成員初始化列表中指定的基類建構函式;
派生類方法可以使用作用域解析運算子來呼叫公有的和受保護的基類方法;
派生類的友元函式可以通過強制型別轉換,將派生類引用或指標轉換為基類引用或指標;
類設計回顧
1.編譯器生成的成員函式 1 預設建構函式 沒有引數,或所有引數都有預設值 確保物件總能被正確地初始化 star rigel star pleiades 6 功能 1 呼叫基類的預設建構函式以及呼叫本身是物件的成員所屬類的預設建構函式 2 如果派生類建構函式的成員初始化列表中沒有顯式呼叫基類建構函式...
(一四三)類設計回顧
編譯器自動生成的特殊成員函式 預設建構函式 當建構函式無引數 或所有引數都有預設值時 二者不能同時存在 則是預設建構函式。自動生成的預設建構函式,將呼叫基類的預設建構函式 如果類的資料成員是另乙個類的物件,那麼這個資料成員在生成的時候,也會呼叫其預設建構函式。假如定義了某個建構函式,那麼編譯器將不會...
類模板與繼承(7)
當類模板碰到繼承時,需要注意以下幾點 1.當子類繼承的父類是是乙個類模板時,子類在宣告的時候,要指定出父類中t的資料型別 2.如果不指定,編譯器無法給子類分配記憶體 3.如果想要靈活的指出父類中t的型別,子類也需變為類模板 1 include 2 include 3using namespace s...