c++在底層原始碼中 null 這個巨集是這樣定義的:
#ifndef null也就是說如果原始碼是 c++ 程式 null 就是 0,如果是 c 程式 null 表示 (void*)0。那麼為什麼要這樣做呢? 是由於 c++ 中,void * 型別無法隱式轉換為其他型別的指標,此時使用 0 代替 ((void *)0),用於解決空指標的問題。這個 0(0x0000 0000)表示的就是虛擬位址空間中的 0 位址,這塊位址是唯讀的。#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
虛擬位址空間結構圖
c++ 中將 null 定義為字面常量 0,並不能保證在所有場景下都能很好的工作,比如,函式過載時,null 和 0 無法區分:
我們通過下面乙個小小的例子來發現null的一點問題:
class執行結果: null在c++裡表示空指標,看到問題了吧,我們呼叫test.testwork(null),其實期望是呼叫的是void testwork(int * index),但結果呼叫了void testwork(int index)。但使用nullptr的時候,我們能呼叫到正確的函式。test
void testwork(int *index)
};int
main()
c 11關鍵字剖析
1 auto 該關鍵字用於兩種情況 1.宣告變數時 根據初始化表示式自動推斷變數型別。2.宣告函式作為函式返回值的佔位符。2static static變數只初始化一次,除此之外它還有可見性的屬性 1.static修飾函式內的 區域性 變數時,表明它不需要在進入或離開函式時建立或銷毀。且僅在函式內可見...
QT及C 關鍵字
override 描述 override保留字表示當前函式重寫了基類的虛函式。目的 1.在函式比較多的情況下可以提示讀者某個函式重寫了基類虛函式 表示這個虛函式是從基類繼承,不是派生類自己定義的 2.強制編譯器檢查某個函式是否重寫基類虛函式,如果沒有則報錯。用法 在類的成員函式引數列表後面新增該關鍵...
1 C 11 auto關鍵字及用法
auto 可以自動推理資料型別。使用語法如下 include include using namespace std intmain auto c 定義乙個auto的系列的變數必須始終推倒成同一型別 auto x1,x2 auto a,b 如果初始化表示式是引用或const,則去除引用或const語...