C++中nullptr 和 NULL 的區(qū)別及用法
1. 為什么會有nullptr的出現(xiàn)
目的:nullptr的出現(xiàn)主要是為了替代NULL。
那么,為什么要替代NULL呢?
在NULL的定義中存在會有2種方式,有的編譯器會將NULL定義成0,有的編譯器會將NULL定義成((void*)0)。
那么,這兩種定義方式會對c++有什么區(qū)別呢?
在c++中不允許( void* )隱式的轉(zhuǎn)成其他類型,在某些編譯器把NULL定義成((void*)0)的情況下,當你定義變量去賦值NULL時候,NULL就會變定義為0。
另外,這種問題也會對c++的重載特性造成混亂。
接下來,進行代碼演示
2. 代碼演示
這里編寫了MyClass類,里面有兩個重載函數(shù)printf
#include <iostream> using namespace std; class MyClass { public: MyClass() {} ~MyClass() {} public: void printf(char *) /*重載函數(shù)*/ { cout << "This is char*" << endl; } void printf(int) /*重載函數(shù)*/ { cout << "This is int" << endl; } }; int main(int argc, char **argv) { return 0; }
接下來,我們new一個MyClass對象 a并調(diào)用成員函數(shù)printf,傳入NULL
#include <iostream> using namespace std; class MyClass { public: MyClass() {} ~MyClass() {} public: void printf(char *) /*重載函數(shù)*/ { cout << "This is char*" << endl; } void printf(int) /*重載函數(shù)*/ { cout << "This is int" << endl; } }; int main(int argc, char **argv) { MyClass a; a.printf(NULL); return 0; }
調(diào)試結(jié)果
以上可以看到,傳入NULL時,調(diào)用printf(int), 與我們的本意調(diào)用printf(char*)相違背。
我們看看編譯現(xiàn)在把NULL定義為哪種方式,我使用的是vs2017
可以看到將NULL定義0
接下來,我們的主角nullptr就出場了,將主函數(shù)里面的調(diào)用方式修改一下
int main(int argc, char **argv) { MyClass a; a.printf(nullptr); return 0; }
調(diào)試結(jié)果
可以看到調(diào)用的printf(char*),這樣nullptr和NULL的區(qū)別就出來了。
另外,nullptr能隱式轉(zhuǎn)換成各類型指針,可以看看以下代碼
3. 總結(jié)
在現(xiàn)代c++編程中,如遇到要使用NULL的地方,就盡量使用nullptr去替代NULL吧。
到此這篇關(guān)于C++ nullptr 和 NULL 的使用區(qū)別的文章就介紹到這了,更多相關(guān)C++ nullptr 和 NULL區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言超詳細講解字符串函數(shù)和內(nèi)存函數(shù)
這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用,字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進行字符串處理的函數(shù)2022-05-05C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)
這篇文章主要介紹了C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06c++中的內(nèi)聯(lián)函數(shù)inline用法實例
在本篇文章里小編給大家整理的是關(guān)于c++中的內(nèi)聯(lián)函數(shù)inline用法實例以及相關(guān)知識點,有需要的朋友們學習下。2019-09-09