天天看點

C++11标準之NULL與nullptr比較C++标準之NULL與nullptr比較

C++标準之NULL與nullptr比較

随着C++11标準的出現,C++的規範也越來越嚴謹,在減少語言二義性上,C++委員會确實做了很多努力。

在過去,我們如果要表示一個指針為空,我們條件反射肯定會這麼寫:

int *p = NULL;

然而啊,有沒有想過這是有問題的,比如下面的這段代碼:

#include <iostream>

#include <string>

using namespace std;

void func(int* num)

{

    cout << "this is the ptr function..." << endl;

}

void func(int num)

{

    cout << "this is the normal function..." << endl;

}

void main(int argc, char** argv)

{

    func(NULL);

}

程式會輸出什麼?很多人的回答是:輸出this is the ptr function…啊。其實啊,這裡輸出的是:

C++11标準之NULL與nullptr比較C++标準之NULL與nullptr比較

其實啊,在編譯器進行解釋程式時,NULL會被直接解釋成0,是以這裡的參數根本就不是大家所想的NULL,參數已經被編譯器偷偷換成了0,0是整數啊,是以調用的是第二個函數。是以一些程式設計大師也建議将NULL換成0,這樣可以減少後期維護的困難。但是我要怎麼調用第一個函數呢?網上有很多解決辦法(大多是利用之前的标準寫的)。

C++11的出現徹底解決了這個問題,nullptr在C++11中就是代表空指針,不能被轉換成數字(具體底層是怎麼實作的,大家可以看看API),這次再試試,輸出的結果如下圖:

C++11标準之NULL與nullptr比較C++标準之NULL與nullptr比較