FLAMEc隨手記

一陣風飄過~~~

0%

c++ 11 快速複習筆記

下面都是C++11新功能或調整~

這邊左右值重點XDDD

左值為運算式結束後還會持續存在的非暫時物件

右值則為運算式結束後就不再存在之暫時物件

用在一些傳參數時避免做出call by value動作,導致複製出新物件

右值參照 T &&
用於增加對暫存物件使用
主動宣告成右ref或傳入參數右ref,也不會被判定成右ref,需使用std::move轉換

下面使用重載測試呼叫結果~~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool checkrref(int&& t) { return true; }
bool checkrref(const int& t) { return false; }

int getRint() {
int a = 5;
return a;
}

void test(int&& t)
{
std::cout << std::boolalpha << checkrref(t) << "\n";
std::cout << std::boolalpha << checkrref(std::move<int&>(t)) << "\n";
std::cout << std::boolalpha << checkrref(getRint()) << "\n";
}

int main()
{
test(5);
}

false
true
true

  1. const 進化版 constexpr

比如常數陣列宣告,可用constexpr變成能呼叫函示或物件建構式

1
2
3
constexpr int FunSize() {return 10;}

int test[FunSize() + 5]; //15
  1. 初始化串列構造式
    std::initializer_list
    可以使建構參數或函式參數變成可透過語法{}靜態的建構,建構後固定不能改,begin傳回指標
    ex int v[]{1,2,3,4,5}; 編譯器會把{…}變成initializer_list丟給陣列XDD

  2. 初始化語法擴展,更方便吧

    1
    2
    3
    4
    5
    6
    struct ex
    {
    int a,b;
    }

    ex t{0,1}
  3. auto 和 decltype
    auto 用法類似 var, ref型態要用auto&,指標不用
    decltype(T) 能在編譯時期算出型態

  4. 範圍for

    1
    2
    3
    4
    5
    int ar[] = {...}
    for(int &n : ar)
    {
    ...
    }
  5. 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
2
3
4
5
int mt = 5;
auto f = [mt]() mutable {return mt++; };

f(); //return 5
f(); //return 6
  1. 返回型別後置的函式宣告,如下int,可解決decltype計算一些template的回傳型態

    1
    auto funcenddef() -> int {}
    1
    2
    3
    4
    5
    template <typename Container, typename Index>
    auto DoSomething(Container& c, Index i) -> decltype(c[i])
    {
    return c[i];
    }
  2. 物件建構可以呼叫自己的其他建構

    1
    2
    3
    4
    5
    class A
    {
    A():A(0) { }
    A(int i) {}
    }
  3. override檢查
    virtual void virtual_func(float) override; 如果沒有繼承就會出錯

  4. 新nullptr定義指標空值,可以避免NULL或0有時候多載造成的錯誤

  5. 強型別列舉

    1
    2
    3
    4
    enum class Name : int
    {
    ...
    }

    int是預設值,可不指定,也可換成其他型態如uint

  6. using 很像typedef,差別是能給模板別名
    using B = A
    typedef A B

  7. template可以指定默認預設值
    typename T = A

  8. char16_t , char32_t 對應UTF16和UTF32,原本的char對應UTF8

  9. thread_local 不管宣告在哪都會變成每個thread獨立的static物件
    值會保留且獨立!!

  10. default設定預設建構式
    delete禁止產生設定函式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct 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以外資料
    }
  11. static_assert 編譯時期測試assertion

  12. 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,自毀也會解鎖

  1. 多元組型別,就是多個不同型態的東西已特定順序排列的結構
    std::tuple;

  2. 雜湊表(Hash table) , 查詢速度極快!!

    1
    2
    std::unordered_map<T1,T2>
    std::unordered_set<T>

    等等…

  3. 正規表示式 std::regex , 對字串做檢查的

  4. std::shared_ptr是一種ref計數的指針,沒有人在ref時才會銷毀記憶體,可assign給別人,會增加ref count
    std::unique_ptr是自己生命周期到的時候會自動銷毀記憶體,不能assign給別人

  5. 新亂數產生器
    linear_congruential
    subtract_with_carry
    mersenne_twister

  6. std::ref,包裝參照,用在模板需要傳照的時候使用

  7. std::result_of,計算回傳型別統一方法,用在模板return不一樣狀況

  8. std::iota,能對std::array做連續整數填充

  9. std::function 就是 C#System.Action

    1
    2
    3
    4
    5
    int add(int a, int b) {
    return a + b;
    }

    std::function<int(int, int)> func = add;

參考文件:
wiki c++11