nullptr(轉(zhuǎn))

  1. 引入nullptr的原因
    引入nullptr的原因乓梨,這個(gè)要從NULL說起献酗。對(duì)于C和C++程序員來(lái)說蠢莺,一定不會(huì)對(duì)NULL感到陌生。但是C和C++中的NULL卻不等價(jià)蝇闭。NULL表示指針不指向任何對(duì)象呻率,但是問題在于,NULL不是關(guān)鍵字呻引,而只是一個(gè)宏定義(macro)礼仗。
    1.1 NULL在C中的定義
    在C中,習(xí)慣將NULL定義為void*指針值0:
#define NULL (void*)0  

但同時(shí)逻悠,也允許將NULL定義為整常數(shù)0
1.2 NULL在C++中的定義
在C++中元践,NULL卻被明確定義為整常數(shù)0:

// lmcons.h中定義NULL的源碼  
#ifndef NULL  
#ifdef __cplusplus  
#define NULL    0  
#else  
#define NULL    ((void *)0)  
#endif  
#endif

1.3為什么C++在NULL上選擇不完全兼容C?
根本原因和C++的重載函數(shù)有關(guān)童谒。C++通過搜索匹配參數(shù)的機(jī)制单旁,試圖找到最佳匹配(best-match)的函數(shù),而如果繼續(xù)支持void*的隱式類型轉(zhuǎn)換饥伊,則會(huì)帶來(lái)語(yǔ)義二義性(syntax ambiguous)的問題慎恒。

// 考慮下面兩個(gè)重載函數(shù)  
void foo(int i);  
void foo(char* p)  
foo(NULL); // which is called? 
  1. nullptr的應(yīng)用場(chǎng)景
    2.1 編譯器
    如果我們的編譯器是支持nullptr的話,那么我們應(yīng)該直接使用nullptr來(lái)替代NULL的宏定義撵渡。正常使用過程中他們是完全等價(jià)的融柬。對(duì)于編譯器,Visual Studio 2010已經(jīng)開始支持C++0x中的大部分特性趋距,自然包括nullptr粒氧。而VS2010之前的版本,都不支持此關(guān)鍵字节腐。Codeblocks10.5附帶的G++ 4.4.1不支持nullptr外盯,升級(jí)為4.6.1后可支持nullptr(需開啟-std=c++0x編譯選項(xiàng))
    2.2 使用方法
    0(NULL)和nullptr可以交換使用,如下示例:
int* p1 = 0;  
int* p2 = nullptr;  
if(p1 == 0) {}  
if(p2 == 0) {}  
if(p1 == nullptr) {}  
if(p2 == nullptr) {}  
if(p1 == p2) {}  
if(p2) {} 

不能將nullptr賦值給整形翼雀,如下示例:

int n1 = 0;             // ok  
int n2 = nullptr;       // error  
if(n1 == nullptr) {}    // error  
if(n2 == nullptr) {}    // error  
if(nullprt) {}          // error  
nullptr = 0             // error 

上面提到的重載問題饱苟,使用nullptr時(shí),將調(diào)用char*狼渊。

void foo(int)   {cout << "int" << endl;}  
void foo(char*) {cout << "pointer" << endl;}  
foo(0);       // calls foo(int)  
foo(nullptr); // calls foo(char*)
  1. 模擬nullptr的實(shí)現(xiàn)
    某些編譯器不支持c++11的新關(guān)鍵字nullptr箱熬,我們也可以模擬實(shí)現(xiàn)一個(gè)nullptr。
const  
class nullptr_t_t  
{  
public:  
    template<class T>           operator T*() const {return 0;}  
    template<class C, class T>  operator T C::*() const { return 0; }  
private:  
    void operator& () const;  
} nullptr_t = {};  
#undef NULL  
#define NULL nullptr_t  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狈邑,一起剝皮案震驚了整個(gè)濱河市城须,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌米苹,老刑警劉巖糕伐,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蘸嘶,居然都是意外死亡良瞧,警方通過查閱死者的電腦和手機(jī)陪汽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褥蚯,“玉大人掩缓,你說我怎么就攤上這事∽裱遥” “怎么了你辣?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尘执。 經(jīng)常有香客問我舍哄,道長(zhǎng),這世上最難降的妖魔是什么誊锭? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任表悬,我火速辦了婚禮,結(jié)果婚禮上丧靡,老公的妹妹穿的比我還像新娘蟆沫。我一直安慰自己,他們只是感情好温治,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布饭庞。 她就那樣靜靜地躺著,像睡著了一般熬荆。 火紅的嫁衣襯著肌膚如雪舟山。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天卤恳,我揣著相機(jī)與錄音累盗,去河邊找鬼。 笑死突琳,一個(gè)胖子當(dāng)著我的面吹牛若债,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拆融,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蠢琳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冠息?” 一聲冷哼從身側(cè)響起挪凑,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孕索,失蹤者是張志新(化名)和其女友劉穎逛艰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搞旭,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡散怖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年菇绵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镇眷。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咬最,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欠动,到底是詐尸還是另有隱情永乌,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布具伍,位于F島的核電站翅雏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏人芽。R本人自食惡果不足惜望几,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萤厅。 院中可真熱鬧橄抹,春花似錦、人聲如沸惕味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)名挥。三九已至慌随,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躺同,已是汗流浹背阁猜。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹋艺,地道東北人剃袍。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捎谨,于是被迫代替她去往敵國(guó)和親民效。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涛救,服務(wù)發(fā)現(xiàn)畏邢,斷路器,智...
    卡卡羅2017閱讀 134,669評(píng)論 18 139
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)检吆。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法舒萎,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法蹭沛,繼承相關(guān)的語(yǔ)法臂寝,異常的語(yǔ)法章鲤,線程的語(yǔ)...
    子非魚_t_閱讀 31,644評(píng)論 18 399
  • 第1章 第一個(gè)C程序第2章 C語(yǔ)言基礎(chǔ)第3章 變量和數(shù)據(jù)類型第4章 順序結(jié)構(gòu)程序設(shè)計(jì)第5章 條件結(jié)構(gòu)程序設(shè)計(jì)第6章...
    小獅子365閱讀 10,656評(píng)論 3 71
  • 一败徊、 1、請(qǐng)用Java寫一個(gè)冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨(dú)云閱讀 1,375評(píng)論 0 6