侯捷c 物件導向(上)

2021-09-27 07:12:16 字數 3844 閱讀 4978

一、c++程式設計簡介

(1)基於物件:只有乙個class的程式設計 object based

物件導向:幾個class的程式設計 object oriented

(2)class的經典分類:

class without pointer members ——>e.g: complex 複數

class with pointer members  ——>e.g: string 字串

(3)class之間的關係:繼承inheritance、復合composition、委託delegation

(4)學習c++,分為學習c++語言 ,和c++標準庫

(5)c++書籍:語言的書籍《c++primer》第五版,《c++programming language》第四版

提高書籍:《effective c++ third edition》及中文版   《the c++ standard library》《stl原始碼剖析》(stl是標準庫的前身)

二、標頭檔案與類的宣告

(1)標準庫以標頭檔案的形式 存在,只需要include進去就好#include <*.h>

(2)c語言 #include或者 #include,而  c++:  #include或者  #include

(3)標頭檔案的布局:

#ifndef __complex__

#define __complex__

##endif

(4)class的布局:

class header

class body

三、建構函式

(1)inline函式:只要成員函式在class body裡面定義,不需要顯示宣告,就是inline函式,而如果在body之外定義,要想成為inline函式,必須顯示宣告。是否成為inline函式,由編譯器來決定,即使宣告為inline function,也不一定編譯器有能力使之成為inline function。

(2)access level 訪問級別:public ,private ,protected

private:資料的部分用盡量用private

public:函式的部分,大部分用public

(3)建構函式 :建立乙個物件的時候,建構函式自動被呼叫,建構函式可設定默然引數,並用冒號設定引數初始化列表:

pair(const t1& a, const t2& b) : first(a), second(b) {}

引數initializition list和在body裡對引數賦值的區別:乙個是引數初始化;乙個是賦值,是乙個執行的過程,多了計算量;

建立乙個物件,可以有引數,也可以無引數,也可動態建立:complex *p = new complex(4);

class定義了多個建構函式,就是過載overloading

(4)友元函式:

四、引數傳遞和返回值

1、資料放在private裡

2、引數用reference,是否用const

3、返回值用reference傳

4、在類的body裡的函式是否加const

5、建構函式 的 initial list

五、操作符過載與臨時物件

1,、所有的成員的函式帶有乙個隱藏的引數「this」,誰呼叫這個函式誰就是 this

臨時物件 complex() ——》typename();

2、在類外

complex complex::operator+=(complex &c2)

這個是成員函式 operator+= 的實現,所以需要 complex:: ,具有this指標。例如:

inline complex&

complex::operator += (const complex& r)

而下面屬於運算子過載,不是成員函式的時候,就沒有complex:: 。

inline complex

operator - (const complex& x, double y)

六、複習complex類的實現過程

七、三大函式:拷貝構造,拷貝賦值,析構

建構函式

拷貝建構函式

拷貝賦值函式

析構函式

——》只要類帶有指標,就一定需要 拷貝建構函式 和 拷貝賦值函式

淺拷貝——》拷貝建構函式 ,淺拷貝的影響:1、造成記憶體洩漏;2、造成有兩個指標 指向同一塊記憶體

深拷貝——》拷貝賦值函式 步驟:delete  ;new; strcpy;

class裡面有預設的拷貝構造和拷貝賦值函式。如果自己不定義乙個拷貝建構函式,在呼叫拷貝建構函式的時候,就會呼叫預設的淺拷貝建構函式,就會造成問題,所以一定要自己定義拷貝建構函式——深拷貝。

八、堆,棧與記憶體管理

1、static local objects的生命週期

static的生命週期 :object的物件在scope結束以後仍然存在,直到整個程式結束;

非static 的生命週期:object的物件在在scope結束以後就結束了。

global objects的生命週期:

物件 objects 生命結束,就是什麼時候析構函式被呼叫:

2、new——》operator new。new動態建立物件,分三步:第一步,先轉化為operator new 函式,申請分配記憶體。第二步,做型別轉化。第三步,呼叫建構函式

delete ——》operator delete。刪除物件,分兩步:第一步,先呼叫析構函式,第二步,再呼叫operator delete函式。

3、帶中括號[ ]的new[ ]叫做array new,帶中括號[ ]的delete[ ]  叫做array delete。

動態分配所得到的陣列array:complex *p = new complex[3];

new   ——》delete ——》表示呼叫幾次析構函式

new 字串 ——》delete 指標

delete[n] :array new一定要呼叫array delete,delete[n]會呼叫n次析構函式,而delete僅呼叫一次。

九、複習string類的實現過程

十、擴充套件補充:類模板,函式模板,及其他

(1)static :靜態資料 不屬於某乙個物件,而非靜態的是屬於乙個物件的,這種情況需要設定為靜態資料。

靜態函式 沒有this pointer,而非靜態函式有 this pointer,可以用this去取資料,靜態函式要處理資料只能處理靜態資料。

靜態資料一定要在class外面 定義。

給變數賦值,使獲得記憶體的過程叫定義。  

(2)template:類模板  函式模板

(3)namespace:

十 一、復合與繼承

(1)復合composition關係下的構造和析構:構造是由內而外,析構是由外而內 has-a,即先呼叫component的建構函式,再呼叫container的建構函式。

計算記憶體的大小:復合類component的記憶體大小+container的記憶體大小

(2)委託delegation,即composition by reference:在body中宣告乙個 帶指標的 另乙個類    composition by reference

(3)繼承inheritance:(三種繼承方式:public protected private)is-a,繼承主要搭配虛函式來使用

函式的繼承:指的是繼承函式的呼叫權,子類可以呼叫父類的函式。

計算記憶體的大小:先呼叫父類的建構函式,再呼叫子類的建構函式。先呼叫子類的析構,再呼叫父類的析構函式。

十二、虛函式與多型

(1)虛函式:virtual

純虛函式:一定要重新定義。

(2)(a)inheritance + composition下的構造和析構

(b)delegation + inheritance ——》 功能最強大的一種

十三、委託相關設計

侯捷 物件導向 上10

static 1.靜態成員函式與非靜態成員函式的區別在於 靜態成員函式沒有this指標,只能訪問靜態資料 2.靜態資料 類外定義 呼叫靜態函式 1.物件呼叫 2.class name來呼叫 普通成員函式 編譯器自動補this指標 單例模式 靜態static 過載了好多 模板 函式模板 類模板有 函式...

C 物件導向高階程式設計 侯捷

1 防禦式宣告 ifndef complex define complex endif 作用 保證只include一次 2 inline function 在body內進行定義 更快,但最終能否inline由編譯器決定 3 為什麼應該用初始化列表 complex double r 0,double ...

侯捷C 筆記

1.如果是類中唯讀函式後面沒有加上const,這樣如果變數定義成const,而函式沒寫成const,這樣編譯期會困惑。2.相同class的各個物件objects互為友元。3.建構函式初始化用 比 裡面初始化效率更高。4.函式返回值寫成void時,應該考慮鏈式賦值,如果是void就行不通了。5.拷貝賦...