日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

侯捷面向对象编程C++

發布時間:2023/12/20 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 侯捷面向对象编程C++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、C++書籍

語法書籍:

  • 《C++Primer》
  • 《learning Program》

提升書籍

  • 《effective C++》

標準庫

  • 《The C++ standard Libaray》
2、頭文件的規范
#ifndef __CLASS__//防御式申明 #define __CLASS__ class(){} #endif
3、初始化列表

利用構造函數的初始化列表來初始化,可以提高效率,而且如果類內含有沒有默認構造函數的對象,必須用這種方式來初始化數據對象。應該是在進入構造函數體之前,類內所有數據對象都已經經歷了初始化階段。

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、繼承中基類的函數類型
  • 非虛函數:不希望子類重寫
  • 虛函數:有默認定義,希望子類重寫
  • 純虛函數:沒有默認定義,子類必須重寫
虛函數: virtual fun(){}; 純虛函數: virtual fun() = 0; 非虛函數: fun(){};
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++的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。