C++對象原型

C++的對象在內存中是怎麼表示的,數據成員和成員函數之間有什麼關係,this指針究竟是幹嗎的。函數

這裏不考慮虛函數表this

一個對象內存中佔的大小其實就是他的數據成員的大小spa

   這是我用的例子指針

  

class T
{
public:
    T() {}
    void info() const {
        cout << "info\n";
    }
    void printValue() const {
        cout << "value is " << m_value << '\n';
    }
    void fun() const {
        cout << "fun!\n";
    }
private:
    int m_value;
};

註釋掉fun函數和沒註釋的大小都是一個int的大小,4byte。

那麼成員函數類是共用一份代碼,可是咱們在使用的時候,爲何感受是每一個對象都本身有一份,這和兩個方面有緣由。咱們在施加一個動做給一個對象時,這個對象的狀態只能由它的數據成員可以記錄和表示,咱們在須要施加操做的對象身上由它的對象的數據成員所表明的狀態是咱們預期的結果,是咱們感受是各自一份。還有就是this指針是形成假象的技術實現。code

int main()
{
    T *p = NULL;
    p->info();
//    p->printValue();
//    t *p2 = NULL;
//    info(p2);
    
//    cout << sizeof(T) << endl;
    
    
    return 0;
}

咱們在main函數中寫了這段代碼,你認爲只是不可接受的,確實是,你不能對一個NULL執政施加操做,但是結果是

這樣的對象

它很好的運行了。內存

如今咱們寫了這一段代碼原型

struct t {
    int m_value;
};

void info(const t *p) {
    cout << "info\n";
}

void printValue(const t *p) {
    cout << "value is " << p->m_value << '\n';
}

在main函數中寫了這段

int main()
{
//    T *p = NULL;
//    p->info();
//    p->printValue();
    t *p2 = NULL;
    info(p2);

//    cout << sizeof(T) << endl;


    return 0;
}

其實這兩個已經但是瞭解C++對象的原型了,p2就是this指針,它是NULL,不過咱們在info中沒有使用它,因此它沒什麼影響,這就是第一段代碼可以運行的緣由,但是若是咱們call了printValue函數,this是NULL,咱們在函數中訪問了它的m_value,咱們省略了this->,這就和
void printValue(const t *p)
同樣

一個內存段錯誤。
class

相關文章
相關標籤/搜索