沒有實例化的對象依然看一調用方法

常常被告誡,沒有實例化的對象不能調用其成員方法。真的對嗎?答案肯定不是。

其實鑽一鑽編譯運行機制的空子是可以到的。

你執行一下下面的代碼看看,是不是輸出了“help”

class MyClass{
public:
    int data;
    MyClass(){
    
    }
    void print(){
        cout<<"help"<<endl;
    }
};
int main(int argc, const char * argv[]) {
    MyClass* temp;
    temp->print();
    return 0;
}

爲什麼呢?

讓我們捋一捋代碼編譯的過程:

當類被編譯的時候,函數的地址就已經確定了。這個函數地址是被所有的該類對象共享的。

每實例化一個類對象就會有一塊對象地址被分配出來,由一個叫做this的指針指向這個類的數據部分。

當調用成員方法的時候直接就找到了函數的地址,而且這個函數中沒有用到對象的數據,當然就不會由任何問題。


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