modern c++ 中什麼時候使用值,引用,指針

我的讀書筆記,不保證正確性。完整版本: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裏放的是具體類型的話,就不支持多態了對象

相關文章
相關標籤/搜索