常常被告誡,沒有實例化的對象不能調用其成員方法。真的對嗎?答案肯定不是。
其實鑽一鑽編譯運行機制的空子是可以到的。
你執行一下下面的代碼看看,是不是輸出了“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的指針指向這個類的數據部分。
當調用成員方法的時候直接就找到了函數的地址,而且這個函數中沒有用到對象的數據,當然就不會由任何問題。