【C++11空指針】
1、NULL的問題
class Test { public: void TestWork(int index) { std::cout << "TestWork 1" << std::endl; } void TestWork(int * index) { std::cout << "TestWork 2" << std::endl; } }; int main() { Test test; test.TestWork(NULL); test.TestWork(nullptr); }
運行結果:
2、nullptr 解決問題
早在 1972 年,C語言誕生的初期,常數 0 帶有常數及空指針的雙重身分。 C 使用 preprocessor macro NULL
表示空指針, 讓 NULL
及 0
分別代表空指針及常數 0。 NULL
可被定義為 ((void*)0)
或是 0
。
C++ 並不采用 C 的規則,不允許將 void*
隱式轉換為其他類型的指針。 為了使代碼 char* c = NULL;
能通過編譯,NULL 只能定義為 0
。 這樣的決定使得函數重載無法區分代碼的語義:
void foo(char *); void foo(int);
C++ 建議 NULL
應當定義為 0
,所以foo(NULL);
將會調用 foo(int)
, 這並不是程序員想要的行為,也違反了代碼的直觀性。0 的歧義在此處造成困擾。
C++11 引入了新的關鍵字來代表空指針常數:nullptr
,將空指針和整數 0 的概念拆開。 nullptr
的類型為nullptr_t
,能隱式轉換為任何指針或是成員指針的類型,也能和它們進行相等或不等的比較。 而nullptr
不能隱式轉換為整數,也不能和整數做比較。
為了向下兼容,0
仍可代表空指針常數。
char* pc = nullptr; // OK int * pi = nullptr; // OK int i = nullptr; // error foo(pc); // 呼叫 foo(char *)
參考:http://zh.wikipedia.org/wiki/C++0x#.E7.A9.BA.E6.8C.87.E6.A8.99