在c++中爲什麼我們需要nullptr來取代NULL或者0?

最近發現很多同學在c++中表示空指針都習慣爲NULL或者0,這並不是一種優良的習慣

一.在c++中,0和NULL是什麼?

  • 字符串常量0的類型是int,並非指針,當c++在只能使用指針的語境中發現了一個0,c++也會勉強的解釋爲一個空指針,但說到底,在c++中0的類型還是int.
  • 再來談談NULL,因爲c++標準允許各個實現給予NULL非int的整形類型,但是這並不重要,重要的是NULL並不具備指針類型

二.爲什麼最好不要使用0或者NULL,當作空指針

  • 那我們來考慮一下這種情況,如果同時有一個函數,重載了int類型和指針類型
void f(int);
void f(void *);
void f(bool);

這樣會遇到什麼問題,不妨小夥伴們可以試一試

f(NULL)的不確定性會導致發生多義性問題,我們最好不要在指針類型和整形之間做重載.

nullptr的優點在於,它並不具備整形類型,它同時也不具備指針類型,但你可以把它想成一種任意類型的指針,它實際的類型是std:: nullptr_t,這個類型可以隱式轉化爲所有的指針類型
調用重載函數的時候,f(nullptr)會調用void * 那個重載版本的,因爲nullptr_t 並不是一種整型

那麼我們也可以使用模板的方式來避免這一問題

template<typename T>
void run(T d)
{
	f(d);
}

T會推導爲相應的類型,進而進行調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章