天天看點

C++11新特性(3)- 空指針(nullptr)

以前什麼樣

在C語言中,使用NULL來初始化空指針。

char* pch = NULL;

在C++中,可以繼續使用NULL,但是推薦使用0來初始化空指針。

char* pch = 0;

其原因是為了避免搜尋比對參數時可能發生的二義性。

存在的問題

首先觀察下面的代碼,在C++中可以正常編譯。

int i = NULL;

從語義上來講,本應該出錯的。

再看一個稍微複雜一點點的例子,假設我們有下面的代碼:

void output(int value){

   std::cout << "value=" << value << std::endl;

}

void output(char* msg){

   if(msg != 0){

       std::cout << "msg=" << msg << std::endl;

   }else{

       std::cout << "msg=NULL" << std::endl;

   }

}

這是兩個重載的函數。如果我們希望調用output(char*)函數,下面的那種方式都不行:

output(0);

output(NULL);

原因很簡單,0是整數,NULL實際上也是整數0。當然也不是沒有辦法,代碼可以改成這樣:

outpu((char*)0);

output((char*)NULL);

函數調用可以成功,但終究是不大舒服。

C++11的對策

其實我們需要的就是一個字面值來表示空指針,而不是借用數字0。C++11中定義了這個字面值:nullptr。有個它,再調用output函數是就清晰多了。

output(0);         //int參數版本

output(nullptr); //char* 參數版本。

當然,下面的代碼也會發生編譯錯誤。

int i = nullptr;

指針類型的變量就用指針類型的字面值初始化,這是再正常不過的事情了!

閱讀更多更新文章,請掃描下面二維碼,關注微信公衆号【面向對象思考】