C++11標準後,初始化一個空指針可以有以下方式:
int *p1 = 0;
int *p2 = NULL; //預處理變量
int *p3 = nullptr; //C++11新標準,以後儘量用這個代替NULL
爲什麼要新添加一個nullptr字面值常量呢?
考慮以下重載函數:
void fun(int *ptr)
{
cout << "NULL" << endl;
}
void fun(int num)
{
cout << "0" << endl;
}
//如果按照以下方式調用,輸出的結果會是什麼呢?
fun(NULL);
fun(nullptr);
運行結果:
這是因爲C++中NULL是一個預處理變量(在C語言中,NULL被定義爲void *),即爲字面值0,在程序的NULL處簡單的進行替換,所以函數調用實際是這樣的:
fun(0);
顯然,輸出0的函數纔是最佳匹配,因此將調用輸出0的函數而不是輸出NULL的函數,而我們原意是調用輸出NULL的函數。