做爲一個類,他最基礎的成員函數就要數構造函數了。這裏咱們先探討一下構造函數爲何不能是虛函數。html
在解決這個問題以前,要先明白類中函數的調用方式。一個類的函數共用一個函數空間,所以在實例化的對象中是不佔空間的。每當有函數調用的時候,會有一個指向該函數空間的指針,依次開始尋找被調用函數。須要注意的是,虛函數的函數空間與普通的函數不一樣,由於須要類的對象將虛函數實例化,所以不一樣對象的虛函數實例化後不必定相同,因此虛函數的函數空間實際上在對象中。web
知道了以上幾點就能夠明白,若是構造函數是虛函數,就會存在一個矛盾。類須要用構造函數生成對象,而構造函數在對象的虛函數空間中,但此時還不存在對象,不存在虛函數指針,沒法調用構造函數。所以構造函數不能做爲虛函數。app
----------------------------------------------------------------------函數
接下來對函數重載進行總結this
參考:http://www.cnblogs.com/xyl-share-happy/archive/2012/12/06/2804401.htmlspa
咱們學過運算符重載(說實話這一塊我沒學好,看了下書可是什麼都沒記住QAQ),有三種方式:普通函數,友元函數,類成員函數指針
運算符重載是爲了對用戶自定義數據類型的數據的操做與內定義的數據類型的數據的操做形式一致。orm
不能重載的5個運算符:*成員指針訪問運算符;::域運算符;sizeof長度運算符;?:條件運算符;.成員訪問符htm
雙目運算符重載爲成員函數時,僅有一個參數。對象
單目運算符重載爲成員函數時,不能再顯式說明參數,老是隱含了一個參數,該參數是this指針。this指針是指向調用該成員函數對象的指針。
運算符重載函數還能夠爲友元函數。
當重載友元函數時,將沒有隱含的參數this指針。這樣,對雙目運算符,友元函數有2個參數,對單目運算符,友元函數有一個參數。
可是存在一些運算符不能被重載爲友元函數:=,(),[ ],- >。
賦值運算符「=」只能重載爲非靜態成員函數。
不能重載爲靜態成員函數是由於靜態成員函數是屬於整個類的,不是屬於某個對象的,靜態成員函數只能操做靜態數據成員。而賦值運算符「=」是來操做對象的。
若是把賦值運算符「=」重載爲友元函數,會使程序出現兩種矛盾:
(1)程序認爲類中不存在重載賦值運算符「=」的成員函數,因而程序調用相應的構造函數;
(2)在全局中咱們已經將賦值運算符「=」重載爲友元函數,而賦值語句與此函數匹配,因而程序調用這條友元函數。
爲了不矛盾的產生,賦值運算符「=」不容許重載爲友元函數。
另一個特例是流運算符,不能重載爲成員函數,只能重載爲友元函數。
若是要用成員函數,則會有cout.operator<<(const F& f),因此這是不可能的.所以只能用友員來實現,operator<<(cout,f) 而cout是ostream型的,所以有如下標準格式.注意不能加const,由於cout是要改變的,會改變裏的緩衝成員.
friend ostream& operator<<( ostream& cout, constF&) //輸出運算符的標準重載格式.
friend istream& operator>>(istream& is, F& f){ } //輸入運算符重載標準格式
單目運算符重載
-友元函數形式:返回類型 operatorX(形參)
使用:X obj ---> operatorX(obj);
-成員函數形式 儘可能用成員:返回類型 operatorX(/*無形參*/)
使用: X obj ---> obj.operator();
注意:
在類成員函數中重載運算符是不容許返回引用的,會出現「返回局部變量的地址」警告;
把後++,後--看成雙目運算符,第二個操做數是整形;
強制類型轉換:類型(數據) --> (沒必要寫返回類型,由於始終與後面的類 型是相同的) operator類型(無形參) 只能寫成成員函數,不能是友員.
單目運算符重載
-友元函數形式:返回類型 operatorX(形參)
使用:X obj ---> operatorX(obj);
-成員函數形式 儘可能用成員:返回類型 operatorX(/*無形參*/)
使用: X obj ---> obj.operator();