C++中NULL與nullptr的區(qū)別小結(jié)
C++98空值——NULL
在良好的C/C++編程習(xí)慣中,聲明一個(gè)變量時(shí)最好給該變量一個(gè)合適的初始值,否則可能會(huì)出現(xiàn)
不可預(yù)料的錯(cuò)誤,比如未初始化的指針。如果一個(gè)指針沒(méi)有合法的指向,我們基本都是按照如下
方式對(duì)其進(jìn)行初始化:??
int* p = NULL;
NULL實(shí)際上就是宏,在C頭文件stddef.h
中可以看到關(guān)于NULL的定義??
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
可以看到,NULL可能被定義為字面常量0,或者被定義為無(wú)類型指針(void*)的常量。不論采取何
種定義,在使用空值的指針時(shí),都不可避免的會(huì)遇到一些麻煩,比如:
程序本意是想通過(guò)func(NULL)
調(diào)用指針版本的func(int*)
函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖。
在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無(wú)類型的指針(void*)常量,但是編譯器
默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針?lè)绞絹?lái)使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void
*)0。
C++11空值——nullptr
既然使用NULL
存在問(wèn)題,那么就一定會(huì)有其他方式替換它。那就是nullptr
。底層原理上,nullptr
在編譯時(shí)會(huì)被翻譯為一個(gè)空指針常量的特殊值。這個(gè)特殊的值可以根據(jù)編譯器的實(shí)現(xiàn)而有所不同,但它通常被定義為被解引用時(shí)不引發(fā)錯(cuò)誤的值。
一句話總結(jié):nullptr
更安全,不會(huì)出現(xiàn)引發(fā)不必要的錯(cuò)誤。
?nullptr注意事項(xiàng):
1.在使用nullptr
表示指針空值時(shí),不需要包含頭文件,因?yàn)?code>nullptr是C++11作為新關(guān)鍵字引入
的。
2. 在C++11中,sizeof(nullptr)
與 sizeof((void*)0)
所占的字節(jié)數(shù)相同。
3.為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用nullptr。
區(qū)別對(duì)比
特性 | NULL | nullptr |
---|---|---|
引入版本 | C 和早期的 C++ | C++11 |
定義 | 宏,通常定義為 #define NULL 0 | 關(guān)鍵字,類型為 std::nullptr_t |
類型 | 整數(shù)常量,通常是 int | 專用類型 std::nullptr_t |
指針轉(zhuǎn)換 | 可隱式轉(zhuǎn)換為指針類型,但可能引起歧義 | 可隱式轉(zhuǎn)換為任何指針類型,無(wú)歧義 |
整數(shù)轉(zhuǎn)換 | 是一個(gè)整數(shù),參與整數(shù)運(yùn)算 | 不是整數(shù),不能參與整數(shù)運(yùn)算 |
安全性 | 易引起類型混淆,存在潛在的歧義問(wèn)題 | 類型安全,避免了指針和整數(shù)混淆的問(wèn)題 |
適用性 | 向后兼容的代碼,舊式 C++ 項(xiàng)目 | 現(xiàn)代 C++ 編程,推薦使用 |
示例
展示了 nullptr
和 NULL
的不同效果:
#include <iostream> using namespace std; void func(int) { cout << "func(int) called" << endl; } void func(void*) { cout << "func(void*) called" << endl; } int main() { func(NULL); // 輸出:func(int) called,因?yàn)?NULL 是整數(shù)類型 func(nullptr); // 輸出:func(void*) called,因?yàn)?nullptr 是空指針類型 // 類型檢查 int* p1 = NULL; // 合法,NULL 轉(zhuǎn)換為 int* // int val = nullptr; // 錯(cuò)誤,nullptr 不能隱式轉(zhuǎn)換為 int int* p2 = nullptr; // 合法,nullptr 是類型安全的空指針 return 0; }
到此這篇關(guān)于C++中NULL與nullptr的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C++ NULL與nullptr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++ 11 nullptr 空指針示例詳解
- 深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr
- 一文詳解C++關(guān)鍵字nullptr及與NULL的區(qū)別
- C++ for循環(huán)與nullptr的小知識(shí)點(diǎn)分享
- C++11中l(wèi)onglong超長(zhǎng)整型和nullptr初始化空指針
- C++超詳細(xì)講解auto與nullptr的使用
- C++11?nullptr實(shí)現(xiàn)初始化空指針
- C++中nullptr 和 NULL 的區(qū)別及用法
- C++中NULL與nullptr的區(qū)別對(duì)比
相關(guān)文章
Qt采用線程以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù)
在C++中隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。本文主要為大家介紹了Qt如何以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù),感興趣的可以了解一下2022-10-10如何在程序中判斷VS的版本(實(shí)現(xiàn)方法詳解)
下面小編就為大家?guī)?lái)一篇如何在程序中判斷VS的版本(實(shí)現(xiàn)方法詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05C語(yǔ)言鏈表實(shí)現(xiàn)商品庫(kù)存管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)商品庫(kù)存管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01