NULL是C 標(biāo)準(zhǔn)庫(kù)表示空指針的類型,nullptr是C++ stl表示空指針的類型
事實(shí)上,NULL或是nullptr都不是C/C++的關(guān)鍵字
NULL和nullptr的使用應(yīng)該優(yōu)先選用nullptr(參見(jiàn)Effective Modern C++第3章條款8)
理由:
- NULL具有不確定性
NULL通常被這樣定義
#define NULL 0L
由此產(chǎn)生NULL是long整形數(shù)或是空指針的不確定 導(dǎo)致以下代碼編譯出錯(cuò)
static void test(int p) {
std::cout << "test(int)" << std::endl;
}
test(NULL);
2.nullptr解決了這個(gè)問(wèn)題
先貼一段自定義的nullptr實(shí)現(xiàn)
//代碼來(lái)自wiki
const class nullptr_t
{
public:
template<class T>
inline operator T*() const //強(qiáng)制類型轉(zhuǎn)換為某種指針類型時(shí)時(shí)返回0
{ return 0; }
template<class C, class T>
inline operator T C::*() const //強(qiáng)制類型轉(zhuǎn)換為成員變量時(shí)返回0
{ return 0; }
private:
void operator&() const; //禁止引用(空指針不應(yīng)當(dāng)有引用)
} nullptr = {};
nullptr的實(shí)現(xiàn)代碼涉及到重載符號(hào)以及強(qiáng)制類型轉(zhuǎn)換
nullptr可以被強(qiáng)制轉(zhuǎn)換成任何類型的指針,而非NULL這樣的實(shí)質(zhì)上是一個(gè)long整數(shù)