下面都是C++11新功能或調整~
這邊左右值重點XDDD
左值為運算式結束後還會持續存在的非暫時物件
右值則為運算式結束後就不再存在之暫時物件
用在一些傳參數時避免做出call by value動作,導致複製出新物件
右值參照 T &&
用於增加對暫存物件使用
主動宣告成右ref或傳入參數右ref,也不會被判定成右ref,需使用std::move轉換
下面使用重載測試呼叫結果~~~
1 | bool checkrref(int&& t) { return true; } |
false
true
true
- const 進化版 constexpr
比如常數陣列宣告,可用constexpr變成能呼叫函示或物件建構式
1 | constexpr int FunSize() {return 10;} |
初始化串列構造式
std::initializer_list
可以使建構參數或函式參數變成可透過語法{}靜態的建構,建構後固定不能改,begin傳回指標
ex int v[]{1,2,3,4,5}; 編譯器會把{…}變成initializer_list丟給陣列XDD初始化語法擴展,更方便吧
1
2
3
4
5
6struct ex
{
int a,b;
}
ex t{0,1}auto 和 decltype
auto 用法類似 var, ref型態要用auto&,指標不用
decltype(T) 能在編譯時期算出型態範圍for
1
2
3
4
5int ar[] = {...}
for(int &n : ar)
{
...
}lambda 匿名函式 , 就是C#的 () => {} , 但是C++要用外部引用需要設定
外部引用 -> return型態 { 函式內容 }
[](int param) -> int { return param+1; }
外部引用設定
[] // 未定義不能用
[x, &y] // x傳值,y傳ref
[&] // 全部傳ref
[=] // 全部傳值
[&, x] // x傳值,其他全部傳ref
[=, &z] // z傳ref,其他全部傳值
this指標用傳值
mutable,可以使lambda能修改傳值參數,且值能保留,因為式傳值依然不影響外部值
1 | int mt = 5; |
返回型別後置的函式宣告,如下int,可解決decltype計算一些template的回傳型態
1
auto funcenddef() -> int {}
1
2
3
4
5template <typename Container, typename Index>
auto DoSomething(Container& c, Index i) -> decltype(c[i])
{
return c[i];
}物件建構可以呼叫自己的其他建構
1
2
3
4
5class A
{
A():A(0) { }
A(int i) {}
}override檢查
virtual void virtual_func(float) override; 如果沒有繼承就會出錯新nullptr定義指標空值,可以避免NULL或0有時候多載造成的錯誤
強型別列舉
1
2
3
4enum class Name : int
{
...
}int是預設值,可不指定,也可換成其他型態如uint
using 很像typedef,差別是能給模板別名
using B = A
typedef A Btemplate可以指定默認預設值
typename T = Achar16_t , char32_t 對應UTF16和UTF32,原本的char對應UTF8
thread_local 不管宣告在哪都會變成每個thread獨立的static物件
值會保留且獨立!!default設定預設建構式
delete禁止產生設定函式1
2
3
4
5
6
7
8
9struct A
{
A() = default; //預設建構式
A& operator=(const A&) = delete; 禁止產生複製函式
void b(int i); //輸入int
void b(float f) = delete;//禁止輸入float
template<class T> void b(T) = delete; 禁止輸入int以外資料
}static_assert 編譯時期測試assertion
C++標準thread,尚未測試,以前都用Win32的thread…
std::thread
detach , 執行後不再可控制thread,只能等main thread結束後自行銷毀
joint , 等待thread結束
量級越大消耗越大吧!
std::mutex 1量級的類別,本身就能鎖,但是可能會忘記解鎖XDDD
std::lock_guard 2量級的類別,只能等結束自毀解鎖
std::unique_lock 3量級的類別,可以靈活unlock再lock,自毀也會解鎖
多元組型別,就是多個不同型態的東西已特定順序排列的結構
std::tuple;雜湊表(Hash table) , 查詢速度極快!!
1
2std::unordered_map<T1,T2>
std::unordered_set<T>等等…
正規表示式 std::regex , 對字串做檢查的
std::shared_ptr是一種ref計數的指針,沒有人在ref時才會銷毀記憶體,可assign給別人,會增加ref count
std::unique_ptr是自己生命周期到的時候會自動銷毀記憶體,不能assign給別人新亂數產生器
linear_congruential
subtract_with_carry
mersenne_twisterstd::ref,包裝參照,用在模板需要傳照的時候使用
std::result_of,計算回傳型別統一方法,用在模板return不一樣狀況
std::iota,能對std::array做連續整數填充
std::function 就是 C#System.Action
1
2
3
4
5int add(int a, int b) {
return a + b;
}
std::function<int(int, int)> func = add;
參考文件:
wiki c++11