第55課 經典問題解析四

2021-08-14 23:07:06 字數 3855 閱讀 8075

1.1、

new和malloc的區別

1.2、

delete/free的區別

/********************       new和malloc的區別      ****************/

#include

#include

#include //for malloc / free  這兩個都是函式

using namespace std;

class test

~test()

};int main()

2.1、建構函式:

2.1.1、

建構函式

本身不可能

成為虛函式

。因為建立物件時,其型別必須是確定的,如當呼叫new t時,顯然要建立的是t類的物件,而不會是t子類的物件,所以不能宣告為虛函式。

2.1.2、

在建構函式中呼叫

其他虛函式

時,不會發生多型

。一般在進入建構函式前,虛函式表已經建立好,因此,在構造父類時,會根據父類的虛表查詢虛函式,所以呼叫的是父類版本的虛函式,當建立子類時,由於子類虛表會覆蓋父類虛表,所以呼叫的是子類版本的虛函式,所以不會發生多型。

綜上不管是呼叫子類,還是父類時,如果呼叫虛函式則只會呼叫相應的類本身中定義的那個函式版本的虛函式。

2.2、析構函式

2.2.1、

析構函式

本身可以

成為虛函式。比如

base* p = new child, 而delete這時使用的是父類指標,必然要求要通過父類型別的p指標呼叫到子類的析構函式才能正確析構物件,所以可以為虛函式,而且,建議在設計類時,將析構函式設定為虛函式,特別是要作為父類的類裡面的析構函式

2.2.2、

析構函式中呼叫

其他虛函式

時,

不會發生多型

,因為析構階段虛函式表指標已經被銷毀,所以當呼叫虛函式時,只會呼叫本類中定義的那個函式版本,即靜態繫結了。

/****************     多型的現象,父類指標指向子類    ***************/

#include

using namespace std;

class a

virtual void func()

void test()

//父類的析構函式設定為虛函式,這樣在釋放子類時,自動釋放父類的。

virtual~a

()//將父類的析構函式設定為虛函式,

protected:

int m_ival;

};class b : public a

virtual void func()

};int main()

/*0        //先執行初始化列表,再執行建構函式體。

a_func   1

b_func 2

b_func

*//************************  構造,析構,和虛函式     ******************/

#include

#include

using namespace std;

class base

virtual void func()

virtual ~base()

};class derived: public base

virtual void func()

~derived()

};int main()

3.1、

dynamic_cast是與

繼承相關

的型別轉換關鍵字

3.2、

dynamic_cast要求相關的類中

必須有虛函式

3.3、

用於直接或間接繼承關係的指標(引用)之間

3.4、

編譯器會檢查dynamic_cast的使用是否正確

3.5、

型別轉換的結果只可能在執行階段才能得到。

/***************      dynamic_cast的使用  *****************/

#include

#include

using namespace std;

class base

virtual ~base()

};class derived: public base

~derived()

};int main()

else

delete p; //new申請的要delete釋放

return 0; }

(1)c++中解引用運算子和箭頭運算子通常用於指向類物件的指標,但我們可以通過過載這兩個運算子,使其作用於類的物件而不是指標。

為什麼要實現過載->操作符?:過載成成員函式,可以通過物件呼叫,以實現多型。

(2)過載要求:

①箭頭運算子必須是類的成員函式。解引用運算子一般也應該宣告為類的成員函式,但不是必須。

②箭頭運算子返回值必須是乙個指標,或者是乙個過載了箭頭運算子的物件。 a.

如果返回的是

乙個指標

:將呼叫內建的箭頭運算子。執行相當於(*(p.operator->()).mem;的操作。 b.

如果返回是

乙個物件

,則繼續對該物件的過載->操作符,如此遞迴一下,

直到返回的是乙個指標

,再對該指標呼叫mem的操作。操作相當於(*(p.operator->().operator->())).mem;

/************  過載  ->  操作符***********/

#include

using namespace std;

class a

void action()

int x;

};

class b

a* operator ->()

void action()

private:

int x;

a a;

}; class c

b operator ->()

void action()

private:

int x;      //c類裡面私有的變數。

};

int main()

5.1、

new/delete會

觸發建構函式或析構函式

的呼叫5.2、

建構函式

不能

成為虛函式,析構函式

可以

成為虛函式。(將需要繼承的類,即父類的析構函式設定為virtual)

5.3、

建構函式和析構函式中都

無法產生多型行為

5.4、

dynamic_cast是與

繼承相關

的專用轉換關鍵字。

第12課 經典問題解析一

本文內容取自於對狄泰學院 唐佐林老師 c 深度解析 課程的學習總結 const 什麼時候為 唯讀變數?什麼時候是常量?const 常量的判別準則 在編譯期間不能直接確定初始值的 const 識別符號,都被作為唯讀變數處理。const 引用的型別與初始化變數的型別 程式設計實驗 const典型問題分析...

第12課 經典問題解析一

const 什麼時候為唯讀變數?什麼時候為常量?1.1 const常量的判別標準 1 只有用字面量初始化的 const 常量才會進入符號表,如 const int i 0 工作在程式的編譯時期,可以確認初始值為0 2 使用其它變數初始化的 const 常量仍然是唯讀變數,如 const int i ...

經典問題解析四

new關鍵字與malloc函式的區別 new關鍵字是c 的一部分 malloc是由c庫提供的函式 new以具體型別為單位進行記憶體分配 malloc以位元組為單位進行記憶體分配 new在申請記憶體空間時可進行初始化 malloc僅根據需要申請定量的記憶體空間 建構函式不可能成為虛函式 在建構函式執行...