2 C 的重要性質(深入淺出MFC之讀書筆記)

2021-06-05 08:27:22 字數 2312 閱讀 3399

this指標:

類的每乙個成員函式(非static)都帶乙個隱藏引數this指標。

派生類物件可以賦給基類物件,但反過來不行,如果一定需要的話就需要使用指標做強制顯示轉型。

如果以乙個「基類之指標」指向「派生類之物件」,那麼經由該指標只能呼叫基類所定義的引數;如果以乙個「派生類之指標」指向「基類之物件」,必須做明顯的轉型操作,不建議使用;如果基類和派生類都定義了「相同名稱之成員函式」,那麼通過物件指標呼叫成員函式時,到底呼叫哪乙個函式,必須視該指標的原始型別而定,而不是視指標實際所指的物件型別而定,與第一點相同。

mfc有兩個十分重要的虛函式:與document有關的serialize函式和與view有關的ondraw函式。

純虛函式不需要定義其實際操作,它的存在只是為了在派生類中被重新定義。只要是擁有純虛函式的類就是乙個抽象類,它是不能夠被例項化的,也就是說不能根據它產生乙個物件。虛函式派生下去仍為虛函式,且可以省略virtual關鍵字。

每乙個「內含虛函式的類」,編譯器都會為它做出乙個虛函式表,表中的每個元素都指向乙個虛函式的位址,此外,編譯器當然也會為類加上一項成員變數,是乙個指向該虛函式表的指標(常被稱為vptr)。每乙個由此類派生出來的物件都有這麼乙個vptr。當我們通過這個物件呼叫虛函式時,事實上是通過vptr找到虛函式表,再找出虛函式的真實位址。當我們在派生類中改寫虛函式時,虛函式表就受到了影響:表中元素所指的函式位址將不再是基類的函式位址,而是派生類的函式位址。

class cmydoc::public cdocument

cmydoc mydoc;

((cdocument)mydoc).fun();

上述呼叫中呼叫的將是基類cdocument中的函式,因為派生類物件通常都比基類物件大(指記憶體空間),那麼向上強制轉型將會造成物件的內容被切割。

靜態(static)成員變數不屬於物件的一部分,而是類的一部分,所以程式可以在還沒有誕生任何物件的時候就處理此種成員變數,但首先必須初始化它。不要把static成員變數的初始化安排在類的建構函式中,因為建構函式可能被一再地呼叫,應該在應用程式檔案中,類以為的位置設定初值。設定static成員變數初值時,不受任何訪問許可權的束縛。注意static成員變數的型別也出現在初值設定語句中,因為這是乙個初值設定操作而不是賦值操作。如果希望在產生任何物件之前就訪問其類的private static成員變數,則必須設計乙個static成員函式。由於static成員函式不需要借助任何物件就可以被呼叫執行,所以編譯器不會為它暗加乙個this指標。也因為如此,static成員函式無法處理類之中的non-static成員變數。

new相比於malloc不但配置物件所需的記憶體空間,同時會引發建構函式的執行。乙個有著層次結構的類群組,當派生類的物件誕生之時,建構函式的執行是由最基類至最尾端派生類;當物件要毀滅之前,析構函式的執行則是反其道而行。

對於全域性物件,程式一開始,其建構函式就先被執行(比程式進入點更早);程式即將結束前其析構函式被執行。對於區域性物件,當物件誕生時,其建構函式被執行;當程式流程將離開該物件的存活範圍(以至於物件將毀滅)時,其析構函式被執行。對於靜態物件,當物件誕生時建構函式被執行;當程式將結束時(此物件因而將遭致毀滅)其析構函式才被執行,但比全域性物件的析構函式早一步執行。對於以new放生產生出來的物件,當物件誕生時期建構函式被執行,析構函式則在物件被delete時執行。

靜態全域性物件的構造函式呼叫操作必須依靠startup碼幫忙,startup碼是更早於程式進入點(main或winmain)執行起來的碼,由c++編譯器提供被鏈結到程式中。當編譯器編譯程式時,發現乙個靜態物件時,它會把這個物件加到乙個鍊錶之中,它還加上乙個指標,指向物件之建構函式及其引數(如果有的話)。把控制權交給程式進入點之前,startup碼就會快速在該鍊錶上移動,呼叫所有等級在案的建構函式並使用登記在案的引數,於是就初始化了靜態物件。

在程式執行過程中知道某個物件屬於哪一種類在c++中稱為執行期型別資訊(runtime type information,rtti)的能力。

c++的template有兩種,分別針對function和class。

template functions:

template // t是一種型別,而此型別將在呼叫此函式時才給予;

t function(t a,int b)

template classes:

template

class cthree

public:

cthree(t t1,t t2,t t3);

t min();

t max();

private:

t a,b,c;

template

t cthree::min()

t minab=areturn minab注意每乙個成員函式前都要加上template,而且類名應該使用cthree。

深入淺出MFC 2

維護ui物件狀態 update command ui 乙個選單拉下來,使用者可以從命令項的狀態 打勾或者沒有打勾,灰色或者正常 得到一些狀態提示.所有ui物件狀態的維護可以依賴所謂的 update command ui 訊息.傳統sdk程式中要改變選單命令項狀態,可以呼叫enablemenuitem...

MFC深入淺出之基礎篇

引言 mfc是microsoft foundation classes的縮寫,它是建立在windows api之上的c 類庫,目的是使windows程式設計過程更有效率,更符合物件導向的設計思想。一 windows程式設計 windows程式的執行是依靠外部發生的事件來驅動的,即程式不斷等待任何可能...

C 深入淺出之指標

1 指標陣列 char str 10 指標陣列,顧名思義是乙個陣列,其元素是乙個指標。上述 是定義乙個指標陣列,其陣列元素為指向字元的指標。所謂指標陣列,重頭戲在於陣列,指標可以抽象為修飾符,那麼如何來理解指標陣列呢?很簡單,的優先順序高於 因此先被結合,加上陣列名,就構成了陣列。2 陣列指標 in...