C 11 新特性 引入nullprt

2021-07-02 21:42:01 字數 2370 閱讀 5412

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

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

[cpp]view plain

copy

print?

#define null (void*)0

但同時,也允許將null定義為整常數0

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

[cpp]view plain

copy

print?

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

#ifndef null

#ifdef __cplusplus

#define null    0

#else

#define null    ((void *)0)

#endif

#endif

[cpp]view plain

copy

print?

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

void

foo(

inti);  

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可以交換使用,如下示例:

[cpp]view plain

copy

print?

int* p1 = 0;  

int* p2 = nullptr;  

if(p1 == 0) {}  

if(p2 == 0) {}  

if(p1 == nullptr) {}  

if(p2 == nullptr) {}  

if(p1 == p2) {}  

if(p2) {}  

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

[cpp]view plain

copy

print?

intn1 = 0;             

// ok

intn2 = nullptr;       

// error

if(n1 == nullptr) {}    

// error

if(n2 == nullptr) {}    

// error

if(nullprt) {}          

// error

nullptr = 0             // error

上面提到的過載問題,使用nullptr時,將呼叫char*。

[cpp]view plain

copy

print?

void

foo(

int)     

void

foo(

char

*)   

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

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

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

[cpp]view plain

copy

print?

const

class

nullptr_t_t  

template

<

class

c, class

t>  operator 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...