侯捷面向对象编程C++
1、C++書籍
語法書籍:
- 《C++Primer》
- 《learning Program》
提升書籍
- 《effective C++》
標準庫
- 《The C++ standard Libaray》
2、頭文件的規范
#ifndef __CLASS__//防御式申明 #define __CLASS__ class(){} #endif3、初始化列表
利用構造函數的初始化列表來初始化,可以提高效率,而且如果類內含有沒有默認構造函數的對象,必須用這種方式來初始化數據對象。應該是在進入構造函數體之前,類內所有數據對象都已經經歷了初始化階段。
class(int a,classB b):A(a),B(b){};4、不能重載有默認值的構造函數
違背了唯一最佳函數匹配原則
class(int r = 0):R(r){}; class(){}; //以上兩個函數不能同時出現5、函數后面加const
函數后面加const表明在這個函數里面不能改變對象的data,通常與const對象配合使用
const class a;void read() const{return a.data;}6、參數傳遞傳值還是引用?
傳引用比傳值效率高,因為傳值需要在棧內建立一個大小相同的內存,但是傳引用只是一個地址,一般對于字符串,自定義的類對象傳引用更加合適,同時為了防止傳引用被改變原地址內容的值,可以用const修飾。
classA(const classB &b):B(b){};7、不能返回在函數里臨時創建對象的引用
不能返回在函數里臨時創建對象的引用,因為臨時對象函數結束就會被銷毀,其地址沒有意義。其他情況盡量多返回引用。
8、相同的class各個對象之間互為友元
class A { private:int i; public:int f(A &a){return a.i} }9、代碼規范總結
- 數據private
- 初始化列表
- 傳參多引用
- const修飾不能少
10、返回指針對象的引用
傳遞者不需要知道接收者按照什么方式接受
inline complex &complex::operator += (const complex &c) {return *this}返回引用,引用返回的應該是一個左值對象,而value是一個右值對象。
函數返回值是引用(引用當左值),
當一個對象被用作右值的時候,用的是對象的值(內容),
當對象被用作左值的時候,用的是對象的身份(在內存中的位置)。
11、操作符重載的成員函數方法和友元函數方法以及普通方法
成員函數方法多一個this指針,代表左操作數,友元函數和普通函數都沒有這個this指針,而且普通函數不能訪問私有變量。
C++的IO庫操作符不能使用成員函數的方法重載,只能用友元函數重載(如果想訪問私有變量的話)
12、設計一個函數需要思考的問題
- 函數后面要不要加const
- 函數參數要不要加const
- 函數返回:要不要,能不能返回引用
13、若類內有指針,則必須自己寫拷貝構造函數和拷貝賦值函數
因為默認拷貝構造函數會直接賦值指針內的地址,這樣兩個對象內的指針實際上指向同一塊內存,非常不安全。
14、深拷貝和淺拷貝
深拷貝創建一塊新內存存儲內容。淺拷貝,拷貝指針地址,指向同一塊內存。
15、賦值重載操作符
- 釋放之前的內存空間
- 創建新的大小合適的內存空間
- 將右邊對象的內容拷貝到上面創建的空間中
但是如果是自我賦值,需要用一下檢測避免
if(this == &args)return *this;16、堆和棧
一般棧是某一個作用域的內存空間,保存參數,返回地址,以及局部變量,一個函數可以形成一個棧空間。函數結束則棧空間銷毀。
堆是由系統內存分配的全局空間,可動態分配,其中的內存不會因為某個局部作用域結束而受到影響。
{class a;class *p = new class(); } //a 和 p 都是存在于局部作用域中,也就是棧中,但是 new后產生的對象存在于堆中,所以程序結束之后 指針P被銷毀,指針P中的內容是堆中的一個地址,這時候這個堆的這塊地址就無法被銷毀,造成了內存泄漏17、new和delete函數干了什么事情
- new函數
分配內存,轉型,調用構造函數。
- delete函數
調用析構函數(析構函數可能會釋放對象內的動態分配的內存)
釋放這個對象的動態內存
18、delete[] 與delete
當創建動態對象數組時,如果使用delete 和delete[]都能刪除new分配的動態內存,但是使用delete時,只會調用一次對象的析構函數,這個時候如果對象內有指針指向其他動態內存則會發生內存泄漏,但是使用delete[],則會產生了幾個對象就調用幾次析構函數。
19 、類內靜態函數中有靜態變量
class A{static A& getAa(); } A& A::getAa(){static A a;return a; }20、復合類關系下的構造函數和析構函數
構造由內而外,及先調用復合類(組成類)的默認構造函數,再調用類本身的構造函數,析構由外而內。
21、類委托關系(復合引用關系)
22、繼承中基類的析構函數必須是virtual函數
23、繼承中基類的函數類型
- 非虛函數:不希望子類重寫
- 虛函數:有默認定義,希望子類重寫
- 純虛函數:沒有默認定義,子類必須重寫
24、轉換函數
將一個類轉換為另一個類的實例,如下圖黃色表示:
25、explicit
明確函數的使用,編譯器不能進行轉換用作其他用途。如下使用explicit是為了避免二義性
26、函數模板 類模板 成員模板
//函數模板 template <class T> const T& min(const T& a;const T& b) { return b < a?b:a} min(r1,r2)//編譯器可以進行實參推導//
以上程序調用首先是創建兩個子類的pair,然后用子類的pair去構造一個父類pair,由于子類型可以轉化為父類型,所以構造函數正常工作。
27、模板特化,偏特化
增加T的一些特例
28、reference
//同時出現下面兩個函數會引起二義性 void fun(int &a); void fun(int a);29、繼承類 復合類的構造函數 析構函數執行次序
構造函數: 父類 復合類 自己
析構函數: 自己 復合類 父類
30、虛函數
由于子類型可以轉化為父類型,所以構造函數正常工作。
27、模板特化,偏特化
增加T的一些特例
28、reference
//同時出現下面兩個函數會引起二義性 void fun(int &a); void fun(int a);29、繼承類 復合類的構造函數 析構函數執行次序
構造函數: 父類 復合類 自己
析構函數: 自己 復合類 父類
30、虛函數
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的侯捷面向对象编程C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件路径中 / 和 ./ 和 ../的区
- 下一篇: 向算法传递函数:谓词