modern c++ 中何时使用值,引用,指针

本文探讨了C++中资源管理的重要性,特别是valuecopy语义的挑战与优势。通过具体的代码示例,详细介绍了如何使用value和reference来明确资源的所有权,并讨论了智能指针在特定场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人读书笔记,不保证正确性。完整版本: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> aa通过指针唯一持有资源
shared_ptr<A> aa通过指针共享资源,智能计数
vector<unique_ptr<A>> aList利用vector代持资源,支持继承多态

智能指针相对value和reference的三点优势

  • 值可空,因为reference不可空。同时可以考虑用std::optional替代

  • 资源需要共享使用,利用shared_ptr引用计数

  • vector<unique_ptr<A>>,如果vector里放的是具体类型的话,就不支持多态了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值