C++中NULL與nullptr的區(qū)別對(duì)比
前言
在編寫C程序的時(shí)候只看到過NULL,而在C++的編程中,我們可以看到NULL和nullptr兩種關(guān)鍵字,其實(shí)nullptr是C++11版本中新加入的,它的出現(xiàn)是為了解決NULL表示空指針在C++中具有二義性的問題,為了弄明白這個(gè)問題,我查找了一些資料,總結(jié)如下。
一、C程序中的NULL
在C語言中,NULL通常被定義為:#define NULL ((void *)0)
所以說NULL實(shí)際上是一個(gè)空指針,如果在C語言中寫入以下代碼,編譯是沒有問題的,因?yàn)樵贑語言中把空指針賦給int和char指針的時(shí)候,發(fā)生了隱式類型轉(zhuǎn)換,把void指針轉(zhuǎn)換成了相應(yīng)類型的指針。
int *pi = NULL; char *pc = NULL;
二、C++程序中的NULL
但是問題來了,以上代碼如果使用C++編譯器來編譯則是會(huì)出錯(cuò)的,因?yàn)镃++是強(qiáng)類型語言,void*是不能隱式轉(zhuǎn)換成其他類型的指針的,所以實(shí)際上編譯器提供的頭文件做了相應(yīng)的處理:
#ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
可見,在C++中,NULL實(shí)際上是0.因?yàn)镃++中不能把void*類型的指針隱式轉(zhuǎn)換成其他類型的指針,所以為了結(jié)果空指針的表示問題,C++引入了0來表示空指針,這樣就有了上述代碼中的NULL宏定義。
但是實(shí)際上,用NULL代替0表示空指針在函數(shù)重載時(shí)會(huì)出現(xiàn)問題,程序執(zhí)行的結(jié)果會(huì)與我們的想法不同,舉例如下:
#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();
}

在這段代碼中,我們對(duì)函數(shù)func進(jìn)行可重載,參數(shù)分別是void*類型和int類型,但是運(yùn)行結(jié)果卻與我們使用NULL的初衷是相違背的,因?yàn)槲覀儽緛硎窍胗肗ULL來代替空指針,但是在將NULL輸入到函數(shù)中時(shí),它卻選擇了int形參這個(gè)函數(shù)版本,所以是有問題的,這就是用NULL代替空指針在C++程序中的二義性。
三、C++中的nullptr
為解決NULL代指空指針存在的二義性問題,在C++11版本(2011年發(fā)布)中特意引入了nullptr這一新的關(guān)鍵字來代指空指針,從上面的例子中我們可以看到,使用nullptr作為實(shí)參,確實(shí)選擇了正確的以void*作為形參的函數(shù)版本。
總結(jié):
NULL在C++中就是0,這是因?yàn)樵贑++中void* 類型是不允許隱式轉(zhuǎn)換成其他類型的,所以之前C++中用0來代表空指針,但是在重載整形的情況下,會(huì)出現(xiàn)上述的問題。所以,C++11加入了nullptr,可以保證在任何情況下都代表空指針,而不會(huì)出現(xiàn)上述的情況,因此,建議以后還是都用nullptr替代NULL吧,而NULL就當(dāng)做0使用。
其他:在沒有C++ 11的nullptr的時(shí)候,我們?cè)趺唇鉀Q避免這個(gè)問題呢?
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ū)別對(duì)比的文章就介紹到這了,更多相關(guān)C++ NULL與nullptr區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++ 11 nullptr 空指針示例詳解
- 深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr
- 一文詳解C++關(guān)鍵字nullptr及與NULL的區(qū)別
- C++ for循環(huán)與nullptr的小知識(shí)點(diǎn)分享
- C++11中l(wèi)onglong超長(zhǎng)整型和nullptr初始化空指針
- C++超詳細(xì)講解auto與nullptr的使用
- C++11?nullptr實(shí)現(xiàn)初始化空指針
- C++中nullptr 和 NULL 的區(qū)別及用法
- C++中NULL與nullptr的區(qū)別小結(jié)
相關(guān)文章
C++中rapidjson將map轉(zhuǎn)為json的方法
今天小編就為大家分享一篇關(guān)于C++中rapidjson將map轉(zhuǎn)為json的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04
C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實(shí)現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個(gè)值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2021-09-09
函數(shù)指針的強(qiáng)制類型轉(zhuǎn)換實(shí)現(xiàn)代碼
函數(shù)指針的強(qiáng)制類型轉(zhuǎn)換實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10
結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法
這篇文章主要介紹了C++中l(wèi)ambda表達(dá)式的用法,lambda表達(dá)式的引入可謂是C++11中的一大亮點(diǎn),同時(shí)文中也涉及到了C++14標(biāo)準(zhǔn)中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下2016-01-01

