先看下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 內容居中顯示 解決方法二 其實和解...