C++新标准 侯捷(三) 标准库

本文深入探讨了C++中右值引用的概念及其应用,解释了如何利用右值引用和移动语义来避免不必要的复制,提高程序效率。同时,文章介绍了完美转发(Perfect Forwarding)机制,并指导读者如何编写带有移动意识的类。

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

14.右值引用

之所以放在标准库,是因为它虽是语言的部分,但接下来的东西都与标准库有关。

可以帮忙解决不必要的copy。

当赋值右边是一个右值时,左边的对象可以偷右边对象的资源。

Lvalue :可以出现于operator=左侧者;

Rvalue:只能出现于operator=右侧者。

我们试验发现,整数中a+b=42是不可以的,而字符串中s1+s2=s2,复数中c1+c2=cpmplex<int>(4,9)却可以。

int foo(){return 5;}
...
int x=foo();   //OK
int *p = &foo();    //[Error]右边是取函数返回值得地址,但返回值是个右值
foo() = 7;     //[Error]

所以必须有语法让我们在调用端告诉编译器“这是个右值”。在被调用端

c.insert(ite,Vtype(buf));//临时对象,告诉你用右值。

M c2(std::move(c1));//通过move来告诉你用右值。

15.Perfect Forwarding(完美的传递)

不完美的传递:右值经过forward()传给另一个函数后就变成了左值。

当然,标准库中解决了,不过比较复杂比较底层,因此不在这里具体探讨。用标准库的就可以完美传递,比如std::forward();

16.写一个move aware class(带有move意识的类)

big-three:拷贝构造,拷贝赋值,析构函数。

拷贝构造函数通常伴随着内存操作,因此需要抛出异常,而移动构造函数往往是移动内存所有权,因此不需要抛出异常,所以声明为noexcept。

str._data=null;       //重要,不然的话临时对象生命结束时会把数据部分一起delete。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值