C++11:右值引用和转移赋值
1、左值与右值的区别:
左值:能别赋值的值;能取到地址的值,用&能取到地址,具有持久性;
右值:临时变量;不能用&取到地址;只是字面常量值
2、右值引用
一般用的是左值引用,用&标识
右值引用通过&&获得,只能绑定到将要销毁的对象
如下例子:在代码里面进行了标识:
class MemoryBlock {
public:
//构造器
explicit MemoryBlock(int length) : length_(length), data_(new int[length]()) {
}
virtual ~MemoryBlock() {
if (data_) {
delete[] data_;
data_ = nullptr;
}
}
//拷贝构造,左值引用
MemoryBlock(const MemoryBlock &src) : length_(src.length_), data_(new int[src.length_]()){
std::copy(src.data_, src.data_+length_, data_);
}
//普通的赋值,左值引用
MemoryBlock& operator=(const MemoryBlock &src) {
if (this != &src) {
delete[] data_;
length_ = src.length_;
data_ = new int[length_]();
std::copy(src.data_, src.data_+length_, data_);
}
return *this;
}
//移动构造器,右值引用
MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_) noexcept {
src.length_ = 0;
src.data_ = nullptr;
}
//移动赋值
MemoryBlock& operator=(MemoryBlock &&src) noexcept {
if (this != &src) {
delete[] data_;
length_ = src.length_;
data_ = src.data_;
//将传入的参数设置为空 释放传入的数据
src.length_ = 0;
src.data_ = nullptr;
}
return *this;
}
private:
int length_;
int *data_;
};
MemoryBlock f() {
return MemoryBlock(50);
}
int main()
{
std::cout << "11111111" << std::endl;
MemoryBlock a = f(); // 调用构造器
MemoryBlock b = a; //拷贝构造
MemoryBlock c = std::move(a);// 移动构造器,移动语义
a = f(); // 调用移动赋值运算符,移动语义
b = a; // 调用赋值运算符
c = std::move(a); // 调用移动赋值运算符,移动语义
return 0;
}
//移动构造器
MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_) noexcept {
src.length_ = 0;
src.data_ = nullptr;
}
- 、将入参传给成员
- 、释放传入的数据.
总结:移动构造、移动赋值仅仅是将原来存在的资源移动到其他的位置。因此其自身的资源将会被释放。
C++11:右值引用和转移赋值相关推荐
- std::move C++11 标准新特性: 右值引用与转移语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
- C++11 标准新特性: 右值引用与转移语义(点评)
<<C++11 标准新特性: 右值引用与转移语义>> 原文地址如下 http://www.ibm.com/developerworks/cn/aix/library/1307_ ...
- C++11 标准新特性: 右值引用与转移语义
原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新 ...
- 【转】C++11 标准新特性: 右值引用与转移语义
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...
- C++右值引用与转移和完美转发
C++右值引用与转移和完美转发 1.右值引用 1.1右值 lvalue 是 loactor value 的缩写,rvalue 是 read value 的缩写 左值是指存储在内存中.有明确存储地址(可 ...
- C++11 右值引用和移动语义
C++11 右值引用和移动语义 右值引用 左值与右值 对象的返回形式缺陷 ★移动语义 右值引用引用左值(move) 正确使用move的一个例子 完美转发 转发: 不转发: 右值引用作用 右值引用 C+ ...
- 【C++】C++11 右值引用和移动语义
文章目录 一.左值与左值引用 二.右值与右值引用 三.左值引用和右值引用的比较 四.右值引用的使用场景和意义 1.左值引用的短板 2.移动构造和移动赋值 3.STL 容器的变化 五.万能引用与完美转发 ...
- C++右值引用与转移语义
std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义 转载于:https://www.cnb ...
- C++11 右值引用、移动语义、完美转发、万能引用
C++11 右值引用.移动语义.完美转发.引用折叠.万能引用 转自:http://c.biancheng.net/ C++中的左值和右值 右值引用可以从字面意思上理解,指的是以引用传递(而非值传递)的 ...
最新文章
- 打工人,打工魂,抽终身会员,成为人上人!
- linux释放内存脚本
- Responsive设计——meta标签
- 互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...
- java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
- MYSQL查看和修改存储引擎
- Think Python - Chapter 12 Tuples
- SAP库存管理预留功能评测
- VIM-多文件-多窗口
- 【视觉盛宴二】长见识了,你见过BGA封装芯片的横截面吗!
- background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
- JAVA--位移运算符详细分析【转载】
- EntityManager:seam新手必读(一)
- Kotlin学习笔记18 反射Part2
- 马行走路线的测试用例设计
- 【C++笔记】表达式 语句
- 禁用微信浏览器的下拉_解决微信浏览器禁止下拉查看真实域名网址的问题
- 国内外你知道的设计网站!给你的设计找点灵感!
- 正高、正常高、大地高
- 各纬度气候分布图_高中地理丨各种气候类型分布图+气候问题全总结,再也不怕搞混了!...