脚本宝典收集整理的这篇文章主要介绍了modern c++ 中何时使用值,引用,指针,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
个人读书笔记,不保证正确性。完整版本:https://taowen.gitbooks.io/mo...
学完了之后个人最大感受是一门支持value copy语义的语言太难了。c++这么多年才把坑终于填上(rvalue reference, move constructor, emplace_back)。但是如果不是value copy的语义,c++就不是c++了。精确控制内存layout,以及清晰的ownership,这些都是value copy带来的直接好处。
原则上尽量使用value和reference。对value和reference按照以下表格使用:
场景
写法
含义
持有资源
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替代
资源需要共享使用,利用shared_ptr引用计数
vector<unique_ptr<A>>
,如果vector里放的是具体类型的话,就不支持多态了
以上是脚本宝典为你收集整理的modern c++ 中何时使用值,引用,指针全部内容,希望文章能够帮你解决modern c++ 中何时使用值,引用,指针所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。