物聯(lián)網(wǎng)/嵌入式工程師
重磅升級(jí):新增硬件電路設(shè)計(jì)與實(shí)戰(zhàn),讓你軟硬通吃,同級(jí)PK無(wú)敵!行業(yè)風(fēng)口、政策傾斜,新晉熱門(mén)高薪不內(nèi)卷!0基礎(chǔ)一站式就業(yè)完整路徑,搶占先發(fā)優(yōu)勢(shì)!
int * p = NULL;
int * p = nullptr;
這一小節(jié)來(lái)看看兩者的區(qū)別。
首先看 NULL,在 C++ 中,NULL 其實(shí)就是 0。
例如:
int * p = NULL;
等價(jià)于:
int * p = 0;
因?yàn)樵?C++ 中,0 地址通常是被保護(hù)起來(lái)的,不可訪問(wèn)的。因此用 0 地址來(lái)指代這個(gè)指針哪里都不指,是可以的。但是這里面卻存在一些問(wèn)題。因?yàn)?NULL 就是 0,所以我們可以把 NULL 用在其他地方。
例如:
int a = NULL;
我們可以將一個(gè) int 變量賦值成 NULL,你永遠(yuǎn)無(wú)法阻止有人這么干。而在某些情況下,甚至?xí)诓唤?jīng)意間釀成慘劇。
例如:
class A
{
public:
void func(void * t)
{
}
void func(int i)
{
}
}
這個(gè)類(lèi)中,func 函數(shù)有兩個(gè)重載。這個(gè)時(shí)候,我們嘗試用 NULL 調(diào)用一下:
int main(int argc,char **argv)
{
A a;
a.func(NULL);
return 0;
}
猜猜這個(gè)函數(shù)到底調(diào)用的哪個(gè)重載?
正是由于 NULL 會(huì)導(dǎo)致這樣的混亂,所以在 C++11 標(biāo)準(zhǔn)之后,C++ 標(biāo)準(zhǔn)委員會(huì)為 C++ 添加了 nullptr 關(guān)鍵字。我們可以將 NULL 賦值給一個(gè)普通變量,而 nullptr 卻不能。
int a = nullptr;
這樣是會(huì)直接報(bào)錯(cuò)的。
nullptr 只能賦值給指針,所以不會(huì)有 NULL 那樣的問(wèn)題。
所以,只要你的編譯器兼容 C++11 標(biāo)準(zhǔn),那么你應(yīng)該使用 nullptr。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)