C++11之nullptr


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM