先看一段**:
class a
void print() const
};int main(int argc, const char * argv)
執行結果:
&a::print = 0x100000eb0
print enter. this=0x0
a->v = 1; // 空指標
那麼問題來了。一般情況下,a=null, 為空指標,訪問a都是非法的。但是
1. a->v = 1; --> crash (這裡沒有任何問題,a為空指標,並未例項化)
2. a->print(); --> 輸出 "print enter. this=0x0"
這是乙個有意思的問題。我們先來看上面有4行printf() ,前面2個printf() 都是編譯錯誤。
//printf("a1->print = %p\n", &a1->print); // compile error
//printf("a2.print = %p\n", &a2.print); // compile error
只有最後乙個
printf("&a::print = %p\n", &a::print);
能正確輸出類函式位址,從以上現象可以看出,類函式並不是和類例項繫結的,它是編譯後固有的,儲存在**段,是唯讀的。執行
$nm ./test
可以看到其中一行資訊:
0000000100000eb0 t __znk1a5printev
這個正是 &a::print 的位址。其實c++的類函式本質上跟c函式一樣,只是預設增加了this 引數。
例如上面的
void a::print();
等價於
void __znk1a5printev(a* this);
這樣理解也就沒有問題了。a->print(); 只是查詢到 &a::print 在**段的位址,呼叫該函式,並把 (a=null)作為引數傳入,輸出的 this=0x0,也是證實了這一點。
而對於 a::v 變數,它是和類例項繫結的,只有生成了例項,a::v 才有對應的記憶體空間。所以訪問a::v 的時候,必須保證已經例項化。
深入理解函式
第五章 深入理解函式 1.return語句 有返回值的函式中,return語句的作用式提供整個函式的返回值,並結束當前函式返回到呼叫它的地方。在沒有返回值的函式中也可以使用return語句,例如當前檢查到乙個錯誤時提前結束當前函式的執行並返回 這個函式首先檢查引數x是否大於0,如果x不大於0就列印錯...
深入理解C 過載函式
深入理解c 過載函式 1.定義 c 允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同,即函式的引數列表不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。2.好處 函式過載...
深入理解c 成員函式
1 const成員函式 在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變 思考以下幾種場景 1.const物件可以呼叫非const成員函式和const成員函式嗎?x 2.非const物件可以呼叫非const成員函式和co...