C 11 新特性 引入nullprt

2021-08-06 06:56:00 字數 1875 閱讀 5527

引入nullptr的原因,這個要從null說起。對於c和c++程式設計師來說,一定不會對null感到陌生。但是c和c++中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義(macro)。

在c中,習慣將null定義為void*指標值0:

#define null (void*)0
但同時,也允許將null定義為整常數0

在c++中,null卻被明確定義為整常數0:

// lmcons.h中定義null的原始碼  

#ifndef null

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

// 考慮下面兩個過載函式  

void foo(int i);

void foo(char* p)

foo(null); // which is called?

如果我們的編譯器是支援nullptr的話,那麼我們應該直接使用nullptr來替代null的巨集定義。正常使用過程中他們是完全等價的。

對於編譯器,visual studio 2010已經開始支援c++0x中的大部分特性,自然包括nullptr。而vs2010之前的版本,都不支援此關鍵字。

codeblocks10.5附帶的g++ 4.4.1不支援nullptr,公升級為4.6.1後可支援nullptr(需開啟-std=c++0x編譯選項)

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時,將呼叫char*。

void foo(int)     

void foo(char*)

foo(0); // calls foo(int)

foo(nullptr); // calls foo(char*)

某些編譯器不支援c++11的新關鍵字nullptr,我們也可以模擬實現乙個nullptr。

const  

class nullptr_t_t

templateoperator t c::*() const

private:

void operator& () const;

} nullptr_t = {};

#undef null

#define null nullptr_t

C 11 新特性 引入nullprt

引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...

C 11 新特性 引入nullprt

引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...

C 11 新特性 引入nullprt

引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...