C++ 類(物件導向初探)

下忍發表於2018-07-21

文章概述

我們需要解決這幾個問題:
a. C++類物件中的成員變數和成員函式是一起儲存的嗎?如果不是?
b. C++編譯器如何管理類和物件,具體的說就是物件呼叫類中的方法,C++編譯器是如何區分哪個具體的物件呼叫哪個成員方法的?


C++類物件中的成員變數和成員函式是一起儲存的嗎?如果不是?

我們應該知道C++有兩種成員資料: static,nostatic; 三種成員函式: static,nostatic,virtual。
下面看這個案例:

class A
{
    int a;
    int b;
};

class B
{
    int a;
    int b;
    static int c;
};

class C
{
    int a;
    int b;
    static int c;
public:
    void func() {}
    static void pg() {}
};

int main()
{
    //1. 分析A物件佔的記憶體
    A a;
    cout << sizeof(a) << endl;  //結果是8

    //2. 分析B物件佔的記憶體
    B b;
    cout << sizeof(b) << endl;  //結果是8

    //3. 分析C物件佔的記憶體
    C c;
    cout << sizeof(c) << endl;  //結果是8

    return 0;
}

其實根據輸出結果,我們得出以下的結論:
a. 成員變數:

  • 普通的成員變數儲存在物件中,與strutc變數具有相同的記憶體佈局和位元組對齊方式;
  • 靜態的成員變數儲存於全域性資料區中

b. 成員函式儲存在程式碼段中。


C++編譯器如何管理類和物件,具體的說就是物件呼叫類中的方法,C++編譯器是如何區分哪個具體的物件呼叫哪個成員方法的?

這裡寫圖片描述
其實對於普通的成員函式(不是靜態的成員函式)中, 引數中都有一個this指標。這個this指標其實指向的是物件自己,通過this指標。C++編譯器會知道是哪個物件呼叫的類的成員函式。


我們總結一下:
a. C++類物件中的成員變數和成員函式時分開儲存的;
b. C++類的普通成員函式(包括建構函式,但是不包括靜態的成員函式)中都包含一個指向當前物件的this指標;
c. 靜態成員函式和靜態成員變數屬於類;
d. 靜態成員函式和普通成員函式的區別:
靜態成員函式不包含指向具體物件的this指標,普通的成員函式包含一個指向具體物件的指標。

相關文章