空指針
nullptr 空指針的字面值常量质和,它的類型是std::nullptr_t(定義位于cstddef)
自動類型推斷
auto關(guān)鍵字稳摄,由auto定義的變量必須初始化。
統(tǒng)一初始化和初始化列表
C++11 introduced the concept of uniform initialization, which means that for any initialization, you can use one common syntax. This syntax uses braces, so the following is possible now:
int values[] { 1, 2, 3 };
std::vectorv { 2, 3, 5, 7, 11, 13, 17 };
std::vectorcities {"Berlin", "New York", "London", "Braunschweig", "Cairo", "Cologne"};
std::complexc{4.0,3.0}; // equivalent to c(4.0,3.0)
使用初始化列表初始化時饲宿,不提供初始值時默認值初始化(0或nullptr)厦酬,其他初始化方式若為提供初始值則值是未定義的。
int i; // i has undefined value
int j{}; // j is initialized by 0
int* p; // p has undefined value
int* q{}; // q is initialized by nullptr
使用初始化列表初始化時瘫想,若提供的值會將會損失精度時弃锐,編譯器報錯。
int x1(5.3); // OK, but OUCH: x1 becomes 5
int x2 = 5.3; // OK, but OUCH: x2 becomes 5
int x3{5.0}; // ERROR: narrowing
int x4 = {5.3}; // ERROR: narrowing
char c1{7}; // OK: even though 7 is an int, this is not narrowing
char c2{99999}; // ERROR: narrowing (if 99999 doesn’t fit into a char)
std::vector<int>v1 { 1, 2, 4, 5 }; // OK
std::vector<int>v2 { 1, 2.3, 4, 5.6 }; // ERROR: narrowing doubles to ints
std::initializer_list<>使得函數(shù)支持傳入多值(通過初始值列表)
void print (std::initializer_list<int> vals){
? ? ? ? ? ?for (auto p=vals.begin(); p!=vals.end(); ++p) {?
? ? ? ? ? ? ? ? ? ? std::cout << *p << "\n";
? ? ? ? ? ? ? ? ? ? }
}
print ({12,3,5,7,11,13,17}); // pass a list of values to print()
基于范圍的循環(huán)表達式
for ( decl : coll ) {
? ? ? ? statement
}
coll必須是支持迭代器的容器殿托,或者是數(shù)組霹菊,或者是值列表類型
移動語義和右值引用
避免無意義的拷貝和暫存變量。
The programmer, however, has to specify that a move?is possible unless a temporary is used.
std::move(),位于<utility> 旋廷。std::move(x)本身不會進行移動操作鸠按,只是將臨時變量轉(zhuǎn)換為一個右值引用(X &&x,使用雙&聲明饶碘,表明右值是可以修改的)目尖,表明此臨時變量x將不會再使用了,可以將它的內(nèi)容據(jù)為己有(不需要拷貝)扎运。
移動之后不再使用原來的變量瑟曲,原來的變量有效但是狀態(tài)未定義。
void foo(X &x);//只接受左值
void foo(const X &x);//接受左值和右值
void foo(X &&x);//接受右值
原始字符串字面值豪治、被編碼的字符串字面值
Raw String Literals
此類型的字符串可包含特殊字符洞拨,語法R"delim(...)delim",delim是16個基本字符組成的分隔符除了反斜杠负拟,空格烦衣,圓括號;
例如:R"(\\n)"對應的普通字符串是"\\\n"
常用來定義正則表達式掩浙。
Encoded String Literals
使用編碼前綴花吟,定義特殊編碼的字符串常量:
u8:utf-8,const char
u:char16_t
U:char32_t
L:wchar_t
關(guān)鍵字noexcept
聲明一個函數(shù)不能或不準備拋出異常。
void foo() noexcept;
若在foo函數(shù)內(nèi)部沒有處理發(fā)生的異常厨姚,程序會終止衅澈,調(diào)用std::terminate(),它默認調(diào)用std::abort();
關(guān)鍵字constexpr
使得表達式在編譯期間判斷是否是常量谬墙,或者修飾返回值返回一個常量今布。
constexpr int square (int x){
? ? ? ? ? ? ? ?return x * x;
}
float a[square(9)]; // OK since C++11: a has 81 elements
模板特性
Variadic Templates
可變模板參數(shù)個數(shù),例如處理不同類型的參數(shù)
void print (){}
template<typename T, typename... Types>
?void print (const T& firstArg, const Types&... args)
{
? ? ? ? ? ?std::cout << firstArg << std::endl; // print first argument
? ? ? ? ? ? print(args...); // call print() for remaining arguments
}
Alias Templates (Template Typedef)
template<typename T>
using Vec = std::vector>; // standard vector using own allocator
Vec coll;//即std::vector<int, MyAlloc<int>> coll;
lambda表達式
基本語法:
[ capture list ] { function body } 或
[ capture list ] ? ( paramters list ) ? mutable ? throwSpec ? -> retType { function body }
mutable芭梯、 ?throwSpec险耀、 ?-> retType 可選
調(diào)用:直接調(diào)用弄喘、生成lambda變量間接調(diào)用
[ ] { std::cout << "hello lambda" << std::endl; } (); 或
auto func = [ ] (const std::string &s){ std::cout << "hello lambda" ?<<s << std::endl; };
func("good");
使用尾置返回:
未指明返回值類型時玖喘,若只有一個return語句,根據(jù)返回值自行推斷蘑志;若有其他語句則返回void累奈。
捕獲規(guī)則:全局變量不用捕獲即可使用
[ ]:不捕獲任何變量
[=]:值捕獲本作用域外變量
[&]:引用捕獲作用域外變量
[x, &y]:顯式值捕獲x,引用捕獲y
[=, &y]:值捕獲除y的所有變量急但,y為引用捕獲
[&, x]:引用捕獲除x的所有變量澎媒,x為值捕獲
值捕獲變量在定義lambda時就已經(jīng)確定,在內(nèi)部不可更改其值波桩,但使用mutable說明符可以使之改變戒努。
lambda的類型
lambda的類型是匿名函數(shù),每個不同的lambda的類型是不一樣的镐躲。
#include<functional>
例如表達式
[ ] (int a, int b) -> int { ?return a + b; }
的類型是std::function<int(int ,int)>储玫,用作返回值類型侍筛,可以返回一個lambda對象
std::function<int(int, int)>returnLambda () {
? ? ? ? ? ? return [] (int x, int y) { return x*y; };
}
auto f = returnLambda();
cout <<f(1,2)<<endl;
關(guān)鍵字decltype
編譯器推斷表達式的類型:用于聲明返回值類型,元編程或傳遞lambda的類型
std::map<std::string, sloat> coll;
decltype(coll)::value_type elem;
新的函數(shù)聲明語法
template<typename T1, typename T2>
auto add(T1 x, T2 y) -> decltype(x+y);//尾置返回撒穷,確定返回類型必須預先知道x,y的類型匣椰,但返回類型推斷放在函數(shù)名前面無效(x,y類型此時未知)
作用域枚舉(強枚舉,枚舉類)
enum class Salutation : char { mr, ms, co, none };
1端礼,不可隱式的轉(zhuǎn)換到int或從int轉(zhuǎn)換
2禽笑,使用作用域運算符引用Salutation::mr;
3,可以顯式定義類型(:char)蛤奥,否則默認是:int
4佳镜,可前向聲明枚舉類型
新的基本數(shù)據(jù)類型
char16_t, char32_t, long long, unsigned long long ,std::nullptr_t
其他新特性
Nontype Template Parameters
bitset<32> flags32; // bitset with 32 bits
bitset<50> flags50; // bitset with 50 bits
Default Template Parameters
template<typename T, typename container = vector<T>>
class MyClass;
MyClass<int> x1;//即MyClass<int, vector<int>>
Keyword typename
用來說明其修飾的東西是類型
Member Templates
類的成員函數(shù)可以為模板
Nested Class Templates
嵌套類也可以為類模板
顯式初始化基本數(shù)據(jù)類型
使用不帶參數(shù)的顯式構(gòu)造初始化基本數(shù)據(jù)類型時,為0初始化(所有值都為0)
int i1; // undefined value
int i2 = int(); // initialized with zero
int i3{}; // initialized with zero (since C++11)
main函數(shù)的定義
1喻括,
int main{}
2,
int main (int argc, char* argv[]){}
不一定要return 語句邀杏,隱式返回0,表示成功執(zhí)行唬血;返回非0則表示出錯望蜡;
不使用return來結(jié)束程序可使用exit(), quick_exit(), terminate();