C 類函式深入理解

2021-08-05 18:41:30 字數 1237 閱讀 7298

先看一段**:

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...