C++中NULL和nullptr的區(qū)別

前言

C和C++的變量名是對大小寫敏感的斧散,因此NULL和null并不是一回事,前者是C/C++中的系統(tǒng)關(guān)鍵字颅湘,null并不是。C++11以后又引入了nullptr瞻鹏,用以解決NULL在隱式轉(zhuǎn)換和作為函數(shù)傳入?yún)?shù)時的二義性問題鹿寨。

在C++11以前,在C/C++語言中脚草,我們常常用NULL作為指針變量的初始值。而在C++11之后埂淮,卻不建議你這么做写隶。
其實NULL根據(jù)命名全大寫可以看出來,它是一個常量慕趴,既然是常量鄙陡,就需要進(jìn)行宏定義躏啰。C語言的標(biāo)準(zhǔn)頭文件是這樣定義的

 #define NULL ((void*)0)

而到了C++中,則變成了

#define NULL 0

查閱stddef.h毫捣,可以看到如下定義

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

從定義中可以看出想际,C++中溪厘,NULL其實就是0,但是也可以用作空指針畸悬,只是用作空指針可能是為了兼容C,迫于無奈披粟。
以下一段代碼可以很好地解釋NULL存在的問題:

#include<iostream>
using namespace std;
void test(void *p)
{
    cout<<"p is pointer "<<p<<endl;
 }
void test(int num)
{
    cout<<"num is int "<<num<<endl; 
}
int main(void)
{
    test(NULL);
    return 0; 
}

這時冷冗,如果編譯的話,會報以下錯誤蒿辙,

$ g++ -o test test.cpp
    main.cpp: In function ‘int main()’:
    main.cpp:14:14: error: call of overloaded ‘test(NULL)’ is ambiguous
         test(NULL);

很明顯,NULL存在二義性俺叭,它既是整數(shù)泰偿,也是一個指針,函數(shù)test()無法根據(jù)參數(shù)的數(shù)據(jù)類型判斷應(yīng)該調(diào)用哪一個實現(xiàn)耗跛。
這時使用nullptr的優(yōu)越性就體現(xiàn)出來了,因為它可以很好地把空指針這一層意思給剝離出來牍氛。nullptr就是C++11為了解決這個痛點而推出的東西烟阐。

    test(nullptr);

就會自然而然地走到指針的那個函數(shù)里紊扬。因此唉擂,以后若想使用整數(shù)特性,就賦值為0玩祟,若想使用指針特性,就賦值為nullptr藏鹊,這樣一目了然转锈,減少了未知的Bug的可能性。
多說一句撮慨,為什么要作此改動,我想首先應(yīng)該是C和C++在處理void 類型的時候存在一定的區(qū)別影涉。C語言中规伐,void 類型的變量可以賦值給任意類型的指針,也可以被任意類型的指針賦值猖闪,兩個方向都不會報錯。但是C++具有更嚴(yán)格的類型檢查岔留,前者是不被允許的检柬。
因此下面一段C語言代碼是可以編譯通過的

int main()
{
    void* a;
    int* b=a;
}

但是下面的C++代碼就會報錯

test.cpp:4:7: error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *'
int* b=a;

與此同時,在malloc上里逆,也存在類似的問題:

int len = 100;
int p = malloc(len * sizeof(int)); // C推薦做法
int p = (int )malloc(len * sizeof(int)); // C++推薦做法

malloc函數(shù)返回值得類型是 void*用爪,C不要求強(qiáng)制類型轉(zhuǎn)換,會自動進(jìn)行隱式轉(zhuǎn)換偎血,但是C++則需要盯漂,因為void* 不能轉(zhuǎn)換成其他類型的指針笨农。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竭宰,隨后出現(xiàn)的幾起案子份招,更是在濱河造成了極大的恐慌,老刑警劉巖锁摔,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鄙漏,死亡現(xiàn)場離奇詭異棺蛛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旁赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門终畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人离福,你說我怎么就攤上這事〉” “怎么了絮识?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長次舌。 經(jīng)常有香客問我,道長挪圾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任惯殊,我火速辦了婚禮也殖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忆嗜。我一直安慰自己,他們只是感情好闪湾,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布绩卤。 她就那樣靜靜地躺著,像睡著了一般何暇。 火紅的嫁衣襯著肌膚如雪凛驮。 梳的紋絲不亂的頭發(fā)上裆站,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天宏胯,我揣著相機(jī)與錄音本姥,去河邊找鬼。 笑死婚惫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹰祸。 我是一名探鬼主播密浑,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼街图!你這毒婦竟也來了浇衬?” 一聲冷哼從身側(cè)響起餐济,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤絮姆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篙悯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡螺捐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年定血,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澜沟。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浅乔,死狀恐怖铝条,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情班缰,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布脾拆,位于F島的核電站莹妒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渠驼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一迷扇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧器一,春花似錦厨内、人聲如沸祈秕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至街州,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唆缴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工艳丛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留趟紊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓戴差,卻偏偏與公主長得像铛嘱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墨吓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用帖烘,...
    LZM輪回閱讀 3,284評論 0 6
  • 1.寫一個NSString類的實現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,747評論 2 37
  • 1 文件結(jié)構(gòu) 每個C++/C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration)乾忱,稱為頭文件...
    Mr希靈閱讀 2,863評論 0 13
  • 冬天已然遠(yuǎn)去,擋不住陽光的來臨衷佃。水草的柔漫蹄葱,迷失不了我對燦爛的向往與追求氏义。它必將屬於我图云,夢中的殿堂。因爲(wèi)捨棄竣况,才有...
    蒼山林木閱讀 136評論 0 1
  • "嘀嗒丹泉,嘀嗒”時間一分一秒的過去了。滿懷好奇的我們坐在時光列車上聽天由命的摹恨,由二十年后穿越而來的機(jī)器人任意擺...
    鄧雪梅dxm閱讀 216評論 0 2