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…啊。其實啊,這裡輸出的是:
其實啊,在編譯器進行解釋程式時,NULL會被直接解釋成0,是以這裡的參數根本就不是大家所想的NULL,參數已經被編譯器偷偷換成了0,0是整數啊,是以調用的是第二個函數。是以一些程式設計大師也建議将NULL換成0,這樣可以減少後期維護的困難。但是我要怎麼調用第一個函數呢?網上有很多解決辦法(大多是利用之前的标準寫的)。
C++11的出現徹底解決了這個問題,nullptr在C++11中就是代表空指針,不能被轉換成數字(具體底層是怎麼實作的,大家可以看看API),這次再試試,輸出的結果如下圖: