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

2021-07-17 03:58:25 字數 1411 閱讀 4575

首先呢,要明白一點兒,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()

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

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

union u

;int main()

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

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

int main()

catch(nullptr_t)

}你扔乙個null試試?看他應該用什麼收,正是因為沒有型別,所以就要用它的本質型別,比如long什麼的來說。你扔乙個0試試?那就也不是所謂的空指標型別了,就是要用int什麼的來收了。

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

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

盡可能使用 const

使用 const 的好處在於它允許指定一種語意上的約束 某種物件不能被修改 編譯器具體來實施這種約束。通過 const,你可以通知編譯器和其他程式設計師某個值要保持不變。只要是這種情況,你就要明確地使用 const 因為這樣做就可以借助編譯器的幫助確保這種約束不被破壞。對指標來說,可以指定指標本身為...

盡可能使用const

const定義語義約束 制定乙個不被改動的物件,編譯器會強制實施這項約束。只要某值保持不變時事實,就應該確實說出來,這樣編譯器可以確保這項約束不違反。const多才多藝 可以用在classes外部修飾global或namespace作用域中的常量,或修飾檔案 函式 或區塊作用於中被宣告為static...

盡可能使用const

一 中心思想 1 將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件 函式引數 函式返回型別 函式返回型別 成員函式本體 2 編譯器強制實施bitwise constness,但你編寫程式時應該使用 概念上的常量性 3 當const和non const成員函...