我的讀書筆記,不保證正確性。完整版本:https://taowen.gitbooks.io/mo...html
學完了以後我的最大感覺是一門支持value copy語義的語言太難了。c++這麼多年才把坑終於填上(rvalue reference, move constructor, emplace_back)。可是若是不是value copy的語義,c++就不是c++了。精確控制內存layout,以及清晰的ownership,這些都是value copy帶來的直接好處。c++
原則上儘可能使用value和reference。對value和reference按照如下表格使用:git
場景 | 寫法 | 含義 |
---|---|---|
持有資源 | void f() { A a; ... } |
在f函數的生命週期內,擁有a所持有的資源。f是a的owner |
持有資源 | obj.field = some_value // field 是一個值類型 |
obj和value共享資源 |
用對象持有資源 | obj.field = std::move(some_value) |
由obj開始負責some_value原來負責的資源 |
函數簽名 | void f(A &&a) |
我須要擁有這個參數 |
調用函數 | f(copy(a)) |
複製一份a的全部權,交給f |
調用函數 | f(std::move(a)) |
放棄對a的全部權,移交給f |
函數簽名 | void f(A const &a) |
我只是一個普通的使用者而已,a不可空 |
調用函數 | f(a) |
假定已經沒有隱式拷貝構造和隱式類型轉換這兩個邪惡的存在的話,咱們能夠認爲是把a給f用一用,可是f並不擁有a |
返回值 | A f() { return A(); } |
用值類型返回是很是高效的 |
返回值 | void f(A &a) |
a既是參數又是返回值 |
智能指針的做用是在一些其餘場景下來持有資源函數
寫法 | 含義 |
---|---|
A a |
在函數生命週期持有資源 |
obj.field = a |
在對象的生命週期持有資源 |
vector<A> aList |
利用vector代持資源 |
unique_ptr<A> a |
a經過指針惟一持有資源 |
shared_ptr<A> a |
a經過指針共享資源,智能計數 |
vector<unique_ptr<A>> aList |
利用vector代持資源,支持繼承多態 |
智能指針相對value和reference的三點優點指針
值可空,由於reference不可空。同時能夠考慮用std::optional替代code
資源須要共享使用,利用shared_ptr引用計數htm
vector<unique_ptr<A>>
,若是vector裏放的是具體類型的話,就不支持多態了對象