新特性(1)---nullptr,auto
阿新 • • 發佈:2018-12-15
引入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;
}