欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中NULL與nullptr的區(qū)別對比

 更新時間:2021年05月16日 14:48:04   作者:csu_zhengzy~  
nullptr是c++11中的關(guān)鍵字,下面這篇文章主要介紹了C++中NULL與nullptr區(qū)別的相關(guān)資料,對大家來說還是挺實用的,需要的朋友可以參考下

前言

在編寫C程序的時候只看到過NULL,而在C++的編程中,我們可以看到NULL和nullptr兩種關(guān)鍵字,其實nullptr是C++11版本中新加入的,它的出現(xiàn)是為了解決NULL表示空指針在C++中具有二義性的問題,為了弄明白這個問題,我查找了一些資料,總結(jié)如下。

一、C程序中的NULL

在C語言中,NULL通常被定義為:#define NULL ((void *)0)

所以說NULL實際上是一個空指針,如果在C語言中寫入以下代碼,編譯是沒有問題的,因為在C語言中把空指針賦給int和char指針的時候,發(fā)生了隱式類型轉(zhuǎn)換,把void指針轉(zhuǎn)換成了相應(yīng)類型的指針。

int  *pi = NULL;
char *pc = NULL;

二、C++程序中的NULL

但是問題來了,以上代碼如果使用C++編譯器來編譯則是會出錯的,因為C++是強類型語言,void*是不能隱式轉(zhuǎn)換成其他類型的指針的,所以實際上編譯器提供的頭文件做了相應(yīng)的處理:

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

可見,在C++中,NULL實際上是0.因為C++中不能把void*類型的指針隱式轉(zhuǎn)換成其他類型的指針,所以為了結(jié)果空指針的表示問題,C++引入了0來表示空指針,這樣就有了上述代碼中的NULL宏定義。

但是實際上,用NULL代替0表示空指針在函數(shù)重載時會出現(xiàn)問題,程序執(zhí)行的結(jié)果會與我們的想法不同,舉例如下:

#include <iostream>
using namespace std;
 
void func(void* i)
{
 cout << "func1" << endl;
}
 
void func(int i)
{
 cout << "func2" << endl;
}
 
void main(int argc,char* argv[])
{
 func(NULL);
 func(nullptr);
 getchar();
}

在這段代碼中,我們對函數(shù)func進行可重載,參數(shù)分別是void*類型和int類型,但是運行結(jié)果卻與我們使用NULL的初衷是相違背的,因為我們本來是想用NULL來代替空指針,但是在將NULL輸入到函數(shù)中時,它卻選擇了int形參這個函數(shù)版本,所以是有問題的,這就是用NULL代替空指針在C++程序中的二義性。

三、C++中的nullptr

為解決NULL代指空指針存在的二義性問題,在C++11版本(2011年發(fā)布)中特意引入了nullptr這一新的關(guān)鍵字來代指空指針,從上面的例子中我們可以看到,使用nullptr作為實參,確實選擇了正確的以void*作為形參的函數(shù)版本。

總結(jié):

NULL在C++中就是0,這是因為在C++中void* 類型是不允許隱式轉(zhuǎn)換成其他類型的,所以之前C++中用0來代表空指針,但是在重載整形的情況下,會出現(xiàn)上述的問題。所以,C++11加入了nullptr,可以保證在任何情況下都代表空指針,而不會出現(xiàn)上述的情況,因此,建議以后還是都用nullptr替代NULL吧,而NULL就當(dāng)做0使用。

其他:在沒有C++ 11的nullptr的時候,我們怎么解決避免這個問題呢?

const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }
 
    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
void operator&() const;
} nullptr = {};

到此這篇關(guān)于C++中NULL與nullptr區(qū)別對比的文章就介紹到這了,更多相關(guān)C++ NULL與nullptr區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中關(guān)于互斥量的全面認(rèn)知

    C++中關(guān)于互斥量的全面認(rèn)知

    線程的主要優(yōu)勢在于,能夠通過全局變量來共享信息。不過,這種便捷的共享是有代價的:必須確保多個線程不會同時修改同一變量,或者某一線程不會讀取正由其他線程修改的變量。為了防止出現(xiàn)線程某甲試圖訪?問一共享變量時,線程某乙正在對其進行修改。引入了互斥量
    2022-05-05
  • C/C++調(diào)用Fortran的DLL的操作過程

    C/C++調(diào)用Fortran的DLL的操作過程

    這篇文章主要介紹了C/C++調(diào)用Fortran的DLL,本文以一個簡單的加法器為例,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • MFC之ComboBox控件用法實例教程

    MFC之ComboBox控件用法實例教程

    這篇文章主要介紹了MFC之ComboBox控件用法,包括了ComboBox控件常見的各類用法,非常具有實用價值,需要的朋友可以參考下
    2014-09-09
  • C++中rapidjson將map轉(zhuǎn)為json的方法

    C++中rapidjson將map轉(zhuǎn)為json的方法

    今天小編就為大家分享一篇關(guān)于C++中rapidjson將map轉(zhuǎn)為json的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

    C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

    在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 函數(shù)指針的強制類型轉(zhuǎn)換實現(xiàn)代碼

    函數(shù)指針的強制類型轉(zhuǎn)換實現(xiàn)代碼

    函數(shù)指針的強制類型轉(zhuǎn)換實現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法

    結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法

    這篇文章主要介紹了C++中l(wèi)ambda表達(dá)式的用法,lambda表達(dá)式的引入可謂是C++11中的一大亮點,同時文中也涉及到了C++14標(biāo)準(zhǔn)中關(guān)于lambda的一些內(nèi)容,需要的朋友可以參考下
    2016-01-01
  • C語言中左移和右移運算符詳細(xì)介紹

    C語言中左移和右移運算符詳細(xì)介紹

    這篇文章主要介紹了C語言中左移和右移運算符詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言代碼 模塊化實現(xiàn)三子棋

    C語言代碼 模塊化實現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了C語言 模塊化實現(xiàn)三子棋程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言實現(xiàn)漢諾塔(圖文詳解)

    C語言實現(xiàn)漢諾塔(圖文詳解)

    個人覺得漢諾塔這個遞歸算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網(wǎng)上也有很多代碼,可以直接參考。記得大一開始時就做過漢諾塔的習(xí)題,但是那時代碼寫得很長很長,也是不理解遞歸的結(jié)果。今天重新來實現(xiàn)一下
    2021-08-08

最新評論