深入淺出MFC讀書筆記——c++對象重要性質

工作需要,開始學習MFC,最近在讀《深入淺出MFC》,將所看的內容整理作爲筆記

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

************************************************

**勿在浮沙築高臺——c++重要性質              **

**date:27/12/2013     edit by linuxsbird        **

************************************************

c++的重要性質:封裝性(encapsulation)繼承性(inheritance)多態性(polymorphism)

1 封裝性:

class與struct的區別:

1 關於使用大括號初始化:

  class和struct如果定義了構造函數的話,都不能用大括號進行初始化

  如果沒有定義構造函數,struct可以用大括號初始化。

  如果沒有定義構造函數,且所有成員變量全是public的話,可以用大括號初始化。

2 關於默認訪問權限:

  class中默認的成員訪問權限是private的,而struct中則是public的。

3 關於繼承方式:

  class繼承默認是private繼承,而struct繼承默認是public繼承。

2 繼承性:

主要需要我們掌握this指針

一個對象的this指針並不是對象本身的一部分,不會影響sizeof(對象)的結果。this作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作爲一個隱含參數傳遞給函數。

this指針只能在一個類的成員函數中調用,它表示當前對象的地址。下面是一個例子:
void Date::setMonth( int mn )
{
month =mn;
this->month =mn;
(*this).month =mn;
//這三句是等價的
}
1.this只能在成員函數中使用。
全局函數,靜態函數都不能使用this。
實際上,成員函數默認第一個參數爲T*const register this。
如:
class A
{
public:
int func( int p){}
};
其中,func的原型在編譯器看來應該是: int func(A*const register this, int p);
2. 由此可見,this在成員函數的開始前構造的,在成員的結束後清除。
這個生命週期同任一個函數的參數是一樣的,沒有任何區別。
當調用一個類的成員函數時,編譯器將類的指針作爲函數的this參數傳遞進去。如:
A a;
a.func(10);
此處,編譯器將會編譯成: A::func(&a, 10);
編譯器通常會對this指針做一些優化的,因此,this指針的傳遞效率比較高--如vc通常是通過ecx寄存器來傳遞this參數。
3 虛函數
對於子類指針指向父類,或者父類指針指向子類,我覺得書上總結的比較透徹:

   1.如果你以一個“基類之指針”指向“派生類之對象”,那麼經由該指針你只能夠調用基類所定義的函數。

    2.如果你以一個“派生類之指針”指向一個“基類之對象”,你必須先做明顯的轉型。這種做法很危險,不符合真是的生活經驗,在程序設計上也會給程序員帶來困惑。

    3.如果基類和派生類都定義了“相同名稱的成員函數”,那麼通過對象指針調用成員還數時,到底調用的是哪一個函數,必須視該指針的原始類型而定,而不是視實際所指的對象的類型而定。


虛函數正是爲了對“如果你以一個"基類之指針"指向一個"派生類之對象",那麼經由該指針你只能調用該基類所定義的函數”進行反其道而行之。
對於虛函數的相關結論:
 1.如果你期望派生類重新定義一個成員函數,那麼你應該在基類中把此函數設爲virtual。
 2.以單一指定調用不同函數,這種性質稱爲Polymorphism,也就是多態。
3.虛函數是C++語言的多態性質以及動態綁定的關鍵。
4.既然抽象類中的虛函數不打算調用,我們就不應該定義他,應該把它設爲純虛函數(在函數聲明後加上“=0”) 
5.我們可以說,擁有純虛函數的爲抽象類。
6.抽象類不能產生出對象的實例,但是我們可以擁有指向抽象類的指針,以便於操作抽象類的各個派生類。
7.虛函數派生下去仍爲虛函數,而且可以省略virtual關鍵字。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章