【引言】學了那麼長時間的C++98,是時候進入新世界(C++11)的大門了! ————致敬C++
一、新增的類型
c++11新增了 long long int 和unsigned long long int 支持64位或者更寬的整數;
新增了char16_t , char32_t來支持16位和32位的字符表示;
二、統一的初始化
C++增強了{ }的能力,加大了它的使用範圍。
可以這樣:int num={5}; double num1 {0.33};
甚至可以這樣:int * point = new int[3] {1,6,8};
其中等號都可有可無;
在創建對象時候,花括號還可以當構造函數的參數傳遞部分
例如:
class test
{
public:
test(int x, int y) :_x(x), _y(y){}
private:
int _x;
int _y;
};
int main()
{
test t1{ 1, 2 };//用花括號來傳遞參數
return 0;
}
三、新關鍵字
1.auto,以前這個關鍵字是一個存儲類型說明符;
現在的auto能進行類型自動推斷功能;
double fun(double, int);
int main()
{
auto a = 10;//自動推斷a爲int
auto pa = &a;//自動推斷pa爲int*
auto pf = fun;//自動推斷pf爲函數指針
return 0;
}
注意,auto還能簡化模板聲明,
for (vector<int>::iterator p = v.begin(); p != v.end(); p++);
for (auto p = v.begin(); p != v.end(); p++);
上面的部分可以替換成下面所示;
2.decltype將變量定義爲表達指定的類型
用法 decltype(表達式) 變量;
int a = 0;
double b = 2;
decltype (a*b) ab;//ab爲a*b的類型 也就是double
decltype (&a) p1;//p1爲&a的類型 也就是int*
四、新的聲明
1.返回值後置
C++11設置的一種新語法在函數名和參數後面設置返回值而不是在前面;
這種方法其實看似好像是倒退,但是爲了強行配合decltype的使用;我就是這麼理解的
我們甚至可以吧函數模板寫成下面這種形式,在語法上是通過的
template<class T,class U>
auto fun(T t, U u)->decltype(U*T)
{
...
}
2.模板別名using=
對於模板而言,雖然泛型編程的優勢玲離盡致,但是有些缺點卻不能不說,冗長而且複雜的標示符常常讓我們難以啓齒,爲此我們創建了模板的別名using =
//舊的定義方法
typedef std::vector<int>::iterator itType;
//新的
using itType= std::vector<int>::iterator;
這種語法和typedef的區別在於他不能部分實例化;
3.空指針nullptr
C++11中的新定義的nullptr表示空指針,但也還是允許用0來代表空指針,nullptr不能轉化爲整型,但是可以向後兼容nullptr==0是真。
4.智能指針
C++11拋棄了auto_ptr,加入了shared_ptr、unique_ptr、weak_ptr;這個接觸到多;
5.新的作用域枚舉
6.新的異常規定:
委員會指出了新的函數可能拋出的異常,並且添加了noexcept關鍵字在函數後面;