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