1. 程式人生 > >新特性(1)---nullptr,auto

新特性(1)---nullptr,auto

引入nullptr的原因

c中的null

在c語言中,我們常常會使用null;代表一個空指標,表示指標不指向任何物件。NULL是一個巨集定義,定義如下:

#define NULL ((void *)0)

在使用中通過隱式轉換,將空指標轉換為其他型別的指標。如下將void *轉換為int * 在c中,也支援將null定義為整型0

int *p=NULL;

c++中的null

在c++中,不允許指標的隱式轉換。而為了解決空指標的問題,所以在c++中null定義為整型0;

#define NULL 0

0代表一個空指標,null就是0,但是在c++程式中常常用到過載,就會產生一些二義性問題。

void f
(int); void f(void *);//過載f函式 f(NULL)//執行f,呼叫那個函式???

事實上呼叫的是第一個函式正如上面所說的c++中null代表整型0,但是真實開發中null同時代表空指標會使我們誤以為呼叫了第二個函式。所以nullptr由此誕生。

nullptr

nullptr是一個新的關鍵字。它可以自動轉換為各種指標型別。但不允許轉換為整型型別。 這樣在上面的栗子中,就可以明確知道呼叫的是第二個函式

void f(int);
void f(void *);//過載f函式

f(nullptr)//執行f,呼叫那個函式???

auto

c++11允許你申明一個變數或者物件,而不需要指明他的型別。只需要說他說auto。 但是必須先進行初始化操作,栗子:

auto i=10;//int
double f();
auto d=f();//double

在真正程式設計的時候也不建議這樣來使用auto,直接寫出變數的型別更加清晰易懂。但在使用代替冗長複雜、變數使用範圍專一的變數時候或者表示式很複雜的時候,使用auto能夠簡化程式碼。例如:

vector<string > v;
.....
auto pos =v.begin();
vector<string>::iterator pos2=v.begin();//兩者相同簡化程式碼

在使用模版的時候,可以宣告依賴模板引數的變數型別

template <typename x,typename y>
void test(x x1, x y1) { auto v = x1*y1; cout << v; }