NULL nullptr 0剪不斷理還亂的關係

2021-09-03 02:40:22 字數 2496 閱讀 6658

先看下null的定義,在stddef.h中(/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/stddef.h)

在c中,null定義為((void*)0)。

在c**中,一般用null表示空指標,即指標的0值。例如:

int *p = null;		// 正確

int *p = 0; // 正確

在c++中,null定義為0或者0l。(是0還是0l跟編譯器定義的標頭檔案有關)在c++98**中,我們也只能用null來表示空指標。例如:

#include using namespace std;

class test

};int main()

// compile cmd

// g++ -g -std=c++11 main.cpp -o main

可能有人會問,為什麼c中(void*)0是空指標常量,而c++中不是?

因為c語言中任何型別的指標都可以(隱式地)轉換為void型,反過來也行,而c++中void型不能隱式地轉換為別的型別指標(例如:int*p = (void*)0;使用c++編譯器編譯會報錯)。

到現在為止,似乎一切看起來都還挺好的,沒什麼歧義啊。那我們現在考慮c++函式過載的一種情況,如下:

#include using namespace std;

class test

void func(bool b)

void func(void* c) };

int main()

// compile cmd

// g++ -g -std=c++11 main.cpp -o main

按照我們編碼的意思,a.func(null)應該會呼叫func(void*)才對,但是實際情況卻是編譯不通過,如下:

為什麼呢?

1、a.func(0)這個沒問題,是因為0被編譯器正確地、嚴格地認為是int型,所以嚴格呼叫了func(int)。

2、但是null被認為是0l,這時候沒有乙個函式能嚴格匹配,所以0l就要被轉換,但是轉換成int、bool、void*都可以哪,所以編譯器就混亂了,不知道你到底想要呼叫哪個函式。

解決方案有三種:

case1:再定義乙個func(long)函式,就可以使得null嚴格地和long匹配。

void func(long d)

但是,這時候編譯還是有warning,如下:

case2:就是不要讓廣義整型數和指標作為區分函式過載的引數(這是c++98乙個好的程式設計習慣)。

case3:引入nullptr。

就是為了解決上面函式過載時候的問題,c++11中引入了nullptr關鍵字。

nullptr關鍵字用於標識空指標,是std::nullptr_t型別的(constexpr)變數。它可以轉換成任何指標型別和bool布林型別(主要是為了相容普通指標可以作為條件判斷語句的寫法),但是不能被轉換為整數。也正是因為nullptr不能轉換為整型數,才區分了他和0(null)。

char *p1 = nullptr;     // 正確

int *p2 = nullptr; // 正確

bool b = nullptr; // 正確. if(b)判斷為false

int a = nullptr; // error

在沒有c++11時,沒有nullptr的時候,我們應該怎麼辦呢?

// 出自《effective c++》第二版

const

class nullptr_t

templateinline operator t c::*() const

private:

void operator&() const;

} nullptr = {};

關鍵的地方在於這個類可以通過operator t*和operator t c::*轉換成任何型別的指標,卻不能轉換成int。引入了這個類和這個類的乙個例項nullptr之後,就可以區分整型0值和指標0值了。

leetcode 902 數字dp 不包含0

複習了一下數字dp 肯定不包含0,但是通常數字dp最後計算的結果較小的是包含前導0的,只是沒顯示出來而已,所以這題需要前導0,但是非前導0是不需要算進去的,因此,加個是否是前導0的狀態即可 class solution if i 0 zero zero p 0 continue sum dfs p ...

IE下margin 0 auto不居中解決方法

正常情況下需要將div居中顯示時,使用css樣式 margin 0 auto即可,但有時使用margin 0 auto後在ff chrome裡能居中,而在ie678裡不居中的現象。如下 margin 0 auto 內容居中顯示 可以是對網頁主體宣告文字居中,即body 即 margin 0 auto...

IE下margin 0 auto不居中解決方法

正常情況下需要將div居中顯示時,使用css樣式 margin 0 auto即可,但有時使用margin 0 auto後在ff chrome裡能居中,而在ie678裡不居中的現象。解決方法一 可以是對網頁主體宣告文字居中,即body 即 margin 0 auto 內容居中顯示 解決方法二 其實和解...