古詩詞大全網 - 成語經典 - C++中為什麽要盡可能使用0而不是NULL

C++中為什麽要盡可能使用0而不是NULL

來自網上,僅供學習交流。

首先呢,要明白壹點兒,NULL是壹個無類型的東西,而且是壹個宏。而宏這個東西,從C++誕生開始,就是C++之父嗤之以鼻的東西,他推崇盡量避免宏。而在他的FAQ中,也有相應的壹個關於NULL與0的解釋,也談到了這壹點兒。Stroustrup: C++ Style and Technique

在C++標準中,我們可以見到壹個詞語叫做null pointer constant,其實在C++11標準前,是只承認0為null pointer constant的。所以,在C++中,我們也經常能聽到壹個說法,就是賦予null pointer,應該是使用0,而非NULL。而nullptr pointer constant這個詞語在C++11發布後,終於再添了壹個成員,就是nullptr。而與NULL本質不同的是,nullptr是有類型的(放了在stddef頭文件中),類型是 typdef decltype(nullptr) nullptr_t; 而正是因為是有類型的,這給我們編譯器實現nullptr的時候帶來了更多細節的考慮,當然也給了使用者更多的保障,所以如果妳的編譯器支持nullptr,請壹定使用nullptr!

而nullptr的出現背景,其實是很簡單的,C++哲學上來說就是C++之父壹直對null pointer沒有壹個正式的表示感到非常不滿,而更工程的來說,就是關於重載這個問題。

void f(void*)

{

}

void f(int)

{

}

int main()

{

f(0); // what function will be called?

}

而引入了nullptr,這個問題就得到了真正解決,會很順利的調到void f(void*)這個版本。

好了,真的以為nullptr就這樣了麽? 我前面說過了nullptr是有類型的,叫做nullptr_t,這給我們編譯器實現帶來了諸多要考慮的東西,不幸的話讓我們來舉點兒奇葩例子吧!

union U

{

long i;

nullptr_t t;

};

int main()

{

U u;

u.i = 3;

printf("%ld\n",(long)u.t); // What it is? 0 or 3?

}

那麽這是應該符合union語意還是nullptr的語意呢?這在標準中是沒有說的,我們也為此爭論了非常久。當然在我們編譯器的實現還是保持了nullptr的語意,結果是0。

而nullptr有類型後,還能做什麽呢?那當然就是可以捕獲異常了。

int main()

{

try

{

throw nullptr;

}

catch(nullptr_t)

{

}

}

妳扔壹個NULL試試?看他應該用什麽收,正是因為沒有類型,所以就要用它的本質類型,比如long什麽的來說。妳扔壹個0試試?那就也不是所謂的空指針類型了,就是要用int什麽的來收了。

所以,推崇nullptr是有道理的,我們在編譯器實現nullptr的時候考慮了非常非常多的細節,還有很多妳們可能壹直用不到的情況,我們都要用來測試,目的就是保障開發者的使用。再次那句話,如果妳的編譯器支持nullptr,請壹定使用nullptr!

最後再扯壹點兒,0在C++是很神奇的東西。比如純虛函數為什麽是用=0來設置的,不知道有沒有同學去考慮過這個問題沒有。如果妳深刻理解了C++哲學,這應該就是非常簡答的問題了。學語言嘛,壹定要學到其哲學,妳才能知道其之美,其之威力,尤其是C++。