在c++中,NULLptr 是用來表示空指針的字面量,它比傳統(tǒng)的 NULL 更加安全和直觀。簡單來說,nullptr 是現(xiàn)代C++推薦使用的空指針表示方式,而 NULL 則是c語言遺留下來的用法,在C++中也還能用,但有局限性。
下面從幾個實際使用場景出發(fā),看看 nullptr 怎么用,以及它和 NULL 有哪些區(qū)別。
nullptr的基本用法
nullptr 是一個關鍵字,可以直接用來賦值給指針變量,表示該指針不指向任何有效的對象或函數(shù)。
int* p = nullptr; if (p == nullptr) { // 做一些處理 }
它的類型是 std::nullptr_t,可以自動轉換為任何指針類型,但不能轉換為整數(shù)類型(除非顯式轉換),這避免了誤用。
立即學習“C++免費學習筆記(深入)”;
常見用途包括:
- 初始化指針變量
- 判斷指針是否為空
- 作為函數(shù)參數(shù)傳遞空指針
NULL的問題在哪?
在C++中,NULL 通常被定義為整數(shù)字面量 0 或者 (void*)0。這就帶來了一些問題。
比如下面這個例子:
void func(int); void func(char*); func(NULL); // 調用的是哪一個?
這時候編譯器會優(yōu)先調用 func(int),因為 NULL 被當作整數(shù)0來處理,而不是指針類型。這顯然不是我們期望的行為。
而如果寫成:
func(nullptr); // 正確調用 func(char*)
就不會出現(xiàn)歧義,因為 nullptr 只能匹配指針類型。
nullptr的優(yōu)勢總結
相比 NULL,nullptr 有幾個明顯優(yōu)勢:
- 類型更明確:nullptr 的類型是 std::nullptr_t,不會被誤認為整數(shù)。
- 避免重載歧義:在函數(shù)重載時,能正確匹配到指針版本的函數(shù)。
- 可讀性和安全性更高:一看就知道是空指針,不容易出錯。
- 兼容模板代碼:在泛型編程中表現(xiàn)更好,減少類型推導錯誤。
特別是在大型項目或模板庫中,使用 nullptr 能顯著減少潛在的 bug。
實際建議
如果你在寫現(xiàn)代C++代碼(C++11及以上),建議一律使用 nullptr 替代 NULL。尤其是以下幾種情況:
- 指針初始化
- 函數(shù)參數(shù)是空指針
- 函數(shù)返回值為空指針
- 條件判斷中檢查空指針
當然,如果你維護的是老代碼,里面大量用了 NULL,那也沒必要刻意去改。但新寫的代碼盡量用 nullptr,養(yǎng)成好習慣。
基本上就這些。用起來不復雜,但理解清楚之后,能讓代碼更清晰、更安全。