物件指標為NULL,為什麼還是可以呼叫成員函式

2021-08-20 01:31:54 字數 1110 閱讀 4113

b要理解這個的話。。。成員函式其實可以認為是乙個普通的函式,比如

1

2

3

4

class a;

在編譯器看來,大概就長這個樣子吧:

1

void a_func(a* this, int x) 

};

注意此時y是成員變數,編譯器會自動給它加上this->,也就是

1

void a_func(a* this, int x) 

此時正常的情況就不用說了,說說用null物件指標呼叫成員函式的情況:

1

2

3

4

5

6

7

8

a *pa = null;

pa->func(2);

//在編譯器看來就好像是 a_func(pa, 2);且pa==null

((a*)null)->func(2);

//在編譯器看來就好像是 a_func( ((a*)null), 2);

//好吧我承認這段**跟上面的一毛一樣啦!

此時程式會崩潰!為什麼?因為this指標是null,而你訪問了它的y變數!

----又是我哈哈哈-----

結論:通過物件呼叫成員函式,物件的指標會被傳入函式中,指標名稱為this

因此null物件指標也可以呼叫成員函式

null物件指標呼叫成員函式時,只要不訪問此物件的成員變數,則程式正常執行

null物件指標呼叫成員函式時,一旦訪問此物件的成員變數,則程式崩潰

下面是我加的

同理,當在呼叫虛函式時,對於乙個虛函式呼叫

如b->functionb();

將會被轉化成 (*b->vptr[1])(b),vptr表示由編譯器產生的指標,指向virtual table,而1是virtual table slot的索引值,關聯到functionb函式,此時b為null,因此肯定無法訪問,出現錯誤。

建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行

建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行?主線程只要擁有執行緒控制代碼,事後就可以對執行緒執行某些操作,比如查詢執行緒狀態等等,靠的就是控制代碼,如果沒有控制代碼,系統就無從知道要查的是那個執行緒的狀態。但保持這個控制代碼不關閉,並不是執行緒執行的條件。關閉執行緒控制代碼只是釋放控...

建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行

主線程只要擁有執行緒控制代碼,事後就可以對執行緒執行某些操作,比如查詢執行緒狀態等等,靠的就是控制代碼,如果沒有控制代碼,系統就無從知道要查的是那個執行緒的狀態。但保持這個控制代碼不關閉,並不是執行緒執行的條件。關閉執行緒控制代碼只是釋放控制代碼資源,新開啟執行緒後,如果不再利用其控制代碼,應該關閉...

那麼為什麼作為函式形參的陣列和指標申明可以互換呢?

那麼為什麼作為函式形參的陣列和指標申明可以互換呢?這是一種便利。由於陣列會馬上蛻變為指標,陣列事實上從來沒有傳入過函式。允許指標引數宣告為陣列只不過是為讓它看起來好像傳入了陣列,因為該引數可能在函式內當作陣列使用。特別地,任何宣告 看起來象 陣列的引數,例如 void f char a 在編譯器裡都...