最近發現很多同學在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會推導爲相應的類型,進而進行調用