C 11 新特性 引入nullprt

2021-07-12 04:34:49 字數 2878 閱讀 5001

引入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。

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

null在c/c++標準庫中被定義為乙個巨集,一般為:

#define null ((void*)0) /*c中的「標準」寫法,null被替換為乙個void*型別的指標右值,值等於0;由於是void*型別,可以隱式轉化為其它型別的指標。

#define null 0 //c++,相對c簡化定義的原因是c++中void*無法自由隱式轉換為其它型別的指標,而字面量0可以隱式轉換為指標型別;儘管它實際上可以被作為整數0使用而不引起編譯問題,但要注意,從設計目的上而言,null應當總是只作為空指標使用。

char c = null相當於char c = 0,也就是把c初始化為0。0在這裡並不是空指標的意思,而是隱式轉換成的字元'/0'——值為0的char字元。在c/c++的一般實現中,這樣的行為(值為0的數值型別,無論是void*或int,轉換為char的值還是0)是明確的,但這種用法並不恰當。一如ls的錯誤,ascii及相容字符集中數值0對應的字元為null character(null terminator),應該用nul(沒有在標準庫中定義,語言中char型別用'/0',wchar_t型別用l'/0')而不是null表示。nul的乙個重要應用是作為c風格字串的結尾標誌字元。

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