c++面向對象編程必備“良方”

 

前言:c++面向對象中的繁瑣機制,不得不讓你在編程中頻頻“犯病”,找錯誤,找bug,困擾,是你的病源所在,本人雖不是什麼“良醫”, 卻也算是總結出以下“良方”。注:難免會有記憶上的遺漏,知識上的不夠,遺漏之處還需大家來補充啊!http://blog.csdn.net/zhanxinhang



藥方1 ☞ 必需時刻明白麪向對象編程中要扮演的兩個角色,一個就是你,類的設計者,一個就是用戶,類的使用者,你的設計是針對用戶而言的,當然你也可能是身兼兩職,同時是設計者又是用戶。

藥方2 ☞ 設計一個類時,將聲明放於頭文件,定義放在cpp文件中,因爲類是給用戶使用的,將聲明放在頭文件中,用戶便可以方便使用,而定義在cpp文件中主要是爲了兩點,一提高編譯效率,二避免用戶包含文件後發生重定義。

藥方3 ☞ 聲明完一個類後必須以分號結束,因爲聲明完一個類後後面還可以加一個對象名,用來聲明該類的實例化對象,分號‘;’ 不是表示聲明的結束,而是表示聲明該類對象的結束,如果單純一個分號表示沒有聲明任一對象。

藥方4 ☞ 避免在構造函數裏實例化本類,否則會發生遞歸死循環。

藥方5 ☞ 避免在析構函數裏delete本類實例,否則會發生遞歸死循環。

藥方6 ☞ inline成員函數必須在頭文件裏定義,因爲inline函數本質是內聯展開的,跟#define預編譯類似。

藥方7 ☞ hpp頭文件裏的類或函數必須在hpp頭文件裏定義,因爲hpp的本質是讓編譯器只對hpp文件裏的內容編譯一次,然後將目標代碼附到cpp目標文件中。

藥方8 ☞ hpp頭文件裏的全局變量必須聲明爲static 否則會發生重編譯,static本質是讓編譯器只定義一次。

藥方9 ☞ const 數據成員必須要在初始化列表中賦初值(c++11中也可以直接=號賦值),因爲它是const變量。

藥方10☞ const成員函數不允許你修改類的數據成員。因爲它就是不予許。

藥方11☞ 指向const對象的指針訪問成員函數時,只能訪問const成員函數,因爲指向const對象的指針不予許你修改它所指向的內存的值,而const成員函數不修改類對象數據內存的值,它們倆正好互相吻合。

藥方12☞ static數據成員需要在類外定義,它本質上並非屬於包含它的類。

藥方13☞ static成員函數不包含this指針,因爲它本質上並非屬於本類。

藥方14☞ 如果類中的某一指針數據成員指向分配的內存空間,則一般的做法是定義析構函數,在析構函數裏釋放它所指的內存空間。因爲類的生命週期結束時,如果沒有定義析構函數,則會調用編輯器合成的析構函數,而該合成的析構函數不會智能地釋放數據成員指針所指向的內存,所以必須在類結束之前釋放它指向的內存。還有另一種做法就是將該成員指針定義爲智能指針類型。

藥方15☞ 操作符重載不能重載兩個內置類型的對象,至少要有一個爲類類型或枚舉類型。因爲重載兩個內置類型的對象完全沒有必要。

藥方16☞ 賦值操作符重載(operator=),不宜設爲虛函數,因爲賦值操作符中的指針或引用函數參數有可能是指向基類對象也有可能是指向派生類對象,因此容易發生混淆。

藥方17☞ 在繼承層次中,基類應該定義一個虛析構函數,因爲非虛析構函數不會被繼承,而虛析構函數會在派生類定義析構函數時發生重定義(就是虛表指針指向了派生類的析構函數)。在利用基類指針實現多態時,基類指針指向了新開闢(new)的派生類對象,這時由於基類的析構函數是虛的,所以再利用基類指針釋放(delete)掉派生類對象內存時,就可以順利地執行派生類的析構函數了。

藥方18☞ 模板類或函數,在頭文件中聲明,並且,定義也要在此頭文件中(一般採用hpp頭文件),因爲模板特化機制實際上是編譯時利用模板參數產生可以兼容實例的目標代碼附於使用它的cpp文件中(特化),從而實現多態,而不能預先產生目標代碼就兼容實例的。

藥方19☞ 聲明友元之前必須對該聲明友元的對象,進行聲明或定義。因爲你讓我跟他交朋友,可以,但你必需讓我知道他的爲人吧。^_^

藥方20☞ 你所知的只是滄海一粟,切莫過於驕傲和自滿。


結語:良藥苦口!...

發佈了11 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章