1. 程式人生 > >關於C/C++中的NULL和C++11新引進的nullptr

關於C/C++中的NULL和C++11新引進的nullptr

C/C++使用NULL來表示空指標,它是一個巨集定義,其實質就是0,表示不指向任何記憶體地址的空指標。

VC中的NULL定義在vcruntime.h中。

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

在C++中NULL直接定義為0,而在C裡,NULL是定義為(void*)0的,這也很好理解,C語言可以隱式轉換,而C++卻是需要顯示的寫出型別轉換的。像int *p = (void *) 0;這樣的語句,在C++裡是會報錯的,於是在C++中,就乾脆直接將NULL定義為0。於是問題就來了,直接定義為0,一個int型的字面量,那麼在函式過載時,必定會出現非預期的結果,比如以下這段程式碼:

#include <iostream>

using namespace std;

void func(int a)
{
    cout << "func int" << endl;
}

void func(char* a)
{
    cout << "func char*" << endl;
}
int main()
{
    func(NULL);
    return 0;
}
呼叫處func(NULL)我們希望呼叫的是func(char *a)函式,然而實際上,結果卻是:
func int

將函式呼叫處改為func(nullptr),結果是:

func char*
使用nullptr關鍵字代替NULL巨集定義。