18、深入淺出MFC學習筆記,關於C++

來源:互聯網
上載者:User

一、一些基本概念

1、this指標

Class Crect{public:void setcolor(int color){m_color=color;}}  ;編譯後為:Class Crect{public:void setcolor(int color,(Crect*)this){this.m_color=color;}}

2、如果基類和衍生類別都定義了“相同名稱之成員函數”,那麼通過對象指標調用成員函數時,到底調用哪一個函數,必須視指標的原始類型而定。而不是視指標實際所指的對象的類型所定。(沒有定義虛函數)

3、MFC有兩個重要的虛函數:與document相關的Serialize函數和與view相關的OnDraw函數,在自己的CMyDoc,CMyView中改寫這兩個函數。

4、小結虛函數

1)如果你估計衍生類別會重新定義一個成員函數,那麼你就把基類中的這個函數寫成virtual。

2)通過單一指令調用不同函數,就是多態Polymorphism,"ability to asume many

forms"。

3)虛函數是c++語言polymorphism性質以及動態聯編的關鍵。

4)既然抽象類別中的虛函數不打算被調用,那麼就把它設定成純虛函數。

5)擁有純虛函數者為抽象類別。

6)抽象類別不能產生出對象實體,但是我們可以擁有指向抽象類別的指標,以便於操作抽象類別的各個衍生類別。

7)虛函數派生下去仍是虛函數,可以不寫virtual。

5、每一個“內含虛函數的類”,編譯器都會為它做出一個虛函數表,表中的每一個元素都指向一個虛函數的地址。此外,編譯器當然會為類加上一項成員變數,是一個指向該虛函數表的指標。

虛函數表的內容是依據類中的虛函式宣告次序,一一填入函數指標。衍生類別會繼承基類的虛函數表,當我們再衍生類別中改寫了虛函數時,虛函數表就受到了影響:表中元素所指的函數地址將不再是基類的函數地址,而是衍生類別的函數地址。

對象的起始地址就是vptr。

6、如果在產生任何object之前就存取其class的static變數,則需要設計一個static成員函數。由於static成員函數和static變數一樣,可以不需要藉助任何對象就可以調用,所以編譯器不會為它加上一個this指標,也正因為如此,static的成員函數無法處理非static的成員變數。

7、對於全域對象,程式一開始,其建構函式就開始執行(比程式進入點更早)。程式即將結束前,其解構函式就開始執行。

對於局部對象,當對象誕生時,其建構函式被執行;當程式流程將離開該對象的存活範圍(以至於對象將毀滅)時,其解構函式被執行。

對於靜態(static)對象,當對象誕生時其建構函式被執行;當程式將結束時(此對象因而將遭致毀滅)其解構函式才被執行,但比全域對象的解構函式早一步執行。

對於以new方式產生出來的局部對象,當對象誕生時其建構函式被執行。解構函式則在對象被delete時執行。

8、四種不同對象的生存方式:

第一種:void MyFunc(){CFoo foo;.//在堆棧(stack)之中產生foo對象 ....}第二種:void MyFunc(){...CFoo* pFoo = new CFoo();//在堆 (heap)中產生foo對象 .}第三種:CFoo foo;//在任何一個函數範圍之外做此操作第四種:void MyFunc(){static CFoo foo;//在函數範圍(scope)之內是一個靜態對象…}

不管哪種做法,C++都會產生一個建構函式的調用。前兩種情況C++在配置記憶體之後產生一個隱藏的建構函式調用。第三種情況需要靠startup代碼幫忙。

startup代碼是比main或者WinMain函數更早執行起來的代碼,由c++編譯器提供,能夠用來處理像函數庫初始化、進程資訊設立、I/O stream產生等操作。

當編譯器編譯器發現一個靜態對象時,它會把這個對象加到一個鏈表中。當把控制權交給main函數之前,startup代碼會快速在鏈表上移動,調用所有登記在案的建構函式並使用登記的參數,於是就初始化了靜態對象。

第四種情況相當類似C語言中的靜態局部變數,只會由一個執行個體產生,並且在固定的記憶體上(即不在stack上也不在heap上)。它的建構函式在控制權第一次轉移到其聲明處(也就是MyFunc第一次被調用時)被調用。

9、RTTI

編譯選項:/GR

typeinfo.h

typeid是一個新的重載運運算元(靜態多態,擁有一種以上的形式),參數可以是類名,也可以是對象指標。返回type_info&。

10、MFC支援動態建立,是由一組宏(DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE)和類CRuntimeClass。

11、異常處理

C++的exception基本與C的setjmp,longjmp函數對待的東西。

12、連結器會把所有贅餘的template代碼刪除,這在Borland連結器裡頭稱為smart技術,其它連結器亦使用類似的技術。

參考

[1] 深入淺出MFC

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.