C++中NULL與nullptr的區(qū)別對比
前言
在編寫C程序的時候只看到過NULL,而在C++的編程中,我們可以看到NULL和nullptr兩種關(guān)鍵字,其實nullptr是C++11版本中新加入的,它的出現(xiàn)是為了解決NULL表示空指針在C++中具有二義性的問題,為了弄明白這個問題,我查找了一些資料,總結(jié)如下。
一、C程序中的NULL
在C語言中,NULL通常被定義為:#define NULL ((void *)0)
所以說NULL實際上是一個空指針,如果在C語言中寫入以下代碼,編譯是沒有問題的,因為在C語言中把空指針賦給int和char指針的時候,發(fā)生了隱式類型轉(zhuǎn)換,把void指針轉(zhuǎn)換成了相應(yīng)類型的指針。
int *pi = NULL; char *pc = NULL;
二、C++程序中的NULL
但是問題來了,以上代碼如果使用C++編譯器來編譯則是會出錯的,因為C++是強類型語言,void*是不能隱式轉(zhuǎn)換成其他類型的指針的,所以實際上編譯器提供的頭文件做了相應(yīng)的處理:
#ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
可見,在C++中,NULL實際上是0.因為C++中不能把void*類型的指針隱式轉(zhuǎn)換成其他類型的指針,所以為了結(jié)果空指針的表示問題,C++引入了0來表示空指針,這樣就有了上述代碼中的NULL宏定義。
但是實際上,用NULL代替0表示空指針在函數(shù)重載時會出現(xiàn)問題,程序執(zhí)行的結(jié)果會與我們的想法不同,舉例如下:
#include <iostream> using namespace std; void func(void* i) { cout << "func1" << endl; } void func(int i) { cout << "func2" << endl; } void main(int argc,char* argv[]) { func(NULL); func(nullptr); getchar(); }
在這段代碼中,我們對函數(shù)func進行可重載,參數(shù)分別是void*類型和int類型,但是運行結(jié)果卻與我們使用NULL的初衷是相違背的,因為我們本來是想用NULL來代替空指針,但是在將NULL輸入到函數(shù)中時,它卻選擇了int形參這個函數(shù)版本,所以是有問題的,這就是用NULL代替空指針在C++程序中的二義性。
三、C++中的nullptr
為解決NULL代指空指針存在的二義性問題,在C++11版本(2011年發(fā)布)中特意引入了nullptr這一新的關(guān)鍵字來代指空指針,從上面的例子中我們可以看到,使用nullptr作為實參,確實選擇了正確的以void*作為形參的函數(shù)版本。
總結(jié):
NULL在C++中就是0,這是因為在C++中void* 類型是不允許隱式轉(zhuǎn)換成其他類型的,所以之前C++中用0來代表空指針,但是在重載整形的情況下,會出現(xiàn)上述的問題。所以,C++11加入了nullptr,可以保證在任何情況下都代表空指針,而不會出現(xiàn)上述的情況,因此,建議以后還是都用nullptr替代NULL吧,而NULL就當(dāng)做0使用。
其他:在沒有C++ 11的nullptr的時候,我們怎么解決避免這個問題呢?
const class nullptr_t { public: template<class T> inline operator T*() const { return 0; } template<class C, class T> inline operator T C::*() const { return 0; } private: void operator&() const; } nullptr = {};
到此這篇關(guān)于C++中NULL與nullptr區(qū)別對比的文章就介紹到這了,更多相關(guān)C++ NULL與nullptr區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中rapidjson將map轉(zhuǎn)為json的方法
今天小編就為大家分享一篇關(guān)于C++中rapidjson將map轉(zhuǎn)為json的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2021-09-09函數(shù)指針的強制類型轉(zhuǎn)換實現(xiàn)代碼
函數(shù)指針的強制類型轉(zhuǎn)換實現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法
這篇文章主要介紹了C++中l(wèi)ambda表達(dá)式的用法,lambda表達(dá)式的引入可謂是C++11中的一大亮點,同時文中也涉及到了C++14標(biāo)準(zhǔn)中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下2016-01-01