我的读书笔记,不保证正确性。完整版本: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里放的是具体类型的话,就不支持多态了对象