首页 > 其他分享 >关于右值和移动构造

关于右值和移动构造

时间:2023-05-27 20:45:22浏览次数:36  
标签:变量 右值 move 左值 构造 移动

右值变量只有内容,没有承载这个内容的实体,他表示一个数据信息,你不能像修改左值那样去修改右值变量,不能去取右值变量的地址(但是右值实际上是不是也像左值变量那样也存储在栈地址中我还不清楚)

右值引用是右值变量的别名,左值引用是左值变量的别名。可以把左值想象为容器(不是stl那个容器),而右值是容器里的内容。

std::move操作是获取一个基本内置类型的右值引用,对一个左值使用move操作后会破坏这个左值!所以要注意move之后这个左值就不能再使用它原来的值了(cpp primer P471)!(但是可以给它赋新值)

移动构造函数依赖move操作。

对左值变量而言,它是存在实体的,对一个基本内置类型左值变量A使用move函数(或者调用他的移动运算符/移动构造函数)来初始化另一个同类变量B,相当与把A的内容剪切到B上

注意B并不是接管了A的内存地址(从下面的结果看出2者并不在同一地址),而是“窃取”了A的内容,省去了复制构造的操作,比复制构造有更高的效率(以破坏源对象为代价)。

对于我们自定义的类型,在使用一个对象A去构造另一个对象B,而又不再需要原对象A的场景里(因为移动构造会破坏掉源对象),我们可以自定义这个类的移动构造函数,移动操作并没有规定必须是把一个地址的内容移动到另一个地址,

我们自定义的移动构造可以是接管源对象的地址来达到“移动”的目的(或者对类内每个内置类型成员都调用std::move操作)

#include <iostream>

using namespace std;
int main(){
    string str1("hello");
    cout<<"addr str1: "<<&str1<<endl;
    string str2 = move(str1);
    cout<<"str2: "<<str2<<"   addr str2: "<<&str2<<endl;
    cout<<"addr str1 after: "<<&str1<<endl;
    cout<<"str1: "<<str1<<endl;
    return 0;
}

/* result:
addr str1: 0x7fffffffda10
str2: hello   addr str2: 0x7fffffffda30
addr str1 after: 0x7fffffffda10
str1: 
*/

 

标签:变量,右值,move,左值,构造,移动
From: https://www.cnblogs.com/tan-wm/p/17437299.html

相关文章

  • js原型prototype(实例构造函数的属性) __proto__(实例对象的属性) constructor(实例
    functionPerson(name,age){this.name=namethis.age=age}Person.prototype.sayHi=function(){//原型是公共方法解决构造函数new对象公共属性和方法的内存浪费console.log(this.name+'sayhi!!')}constp1=newPerson('aa',12)constp2=new......
  • html在移动端滑动无效的解决方法
    排查下是否有类似touchmove类似的事件绑定,可能就是其中取消了默认的事件行为。解决方法,在你想滚动的直接父级元素上添加@touchmove.stop="voidnull"类似的事件绑定应该就可以解决了。这里利用了事件冒泡终止的方式。......
  • hdu:第K小的数(构造二分)
    ProblemDescription给定\(n\)个正整数\(a_1,a_2,\dots,a_n\)和\(m\)个正整数\(b_1,b_2,\dots,b_m\)。请在\(n\timesm\)个\(a_i+b_j(1\leqi\leqn,1\leqj\leqm)\)中,找到第\(k\)小的数(不去重)。Input第一行包含一个正整数\(T(1\leqT\leq10)\),表示测试数据的组数。每组......
  • 前端树形结构图treeShapeStruct,可拖拽移动,点击展开收缩,无限添加子集
    快速实现树形结构图,可拖拽移动,点击展开收缩,无限添加子集;下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12650效果图如下:  实现代码如下:#treeShapeStruct树形结构图,可拖拽移动,点击展开收缩,无限添加子集使用方法####HTML代码部分```......
  • 前端树形结构图组件 tree组件,可拖拽移动,点击展开收缩,无限添加子集
    快速实现树形结构图组件tree组件,可拖拽移动,点击展开收缩,无限添加子集;下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12650效果图如下:  实现代码如下:#treeShapeStruct树形结构图,可拖拽移动,点击展开收缩,无限添加子集使用方法####HTM......
  • 什么是构造函数?它有什么作用?
    构造函数是一个特殊的方法,它用于创建对象时初始化对象的实例变量。每个类都至少有一个构造函数,如果没有定义,则会有一个默认的无参构造函数。构造函数与类名相同,没有返回类型。构造函数可以用于为对象分配内存,初始化对象的状态,执行其他初始化任务等。......
  • C++类的基础、构造、析构
    双向链表节点——具体的表表里面要维护什么是由你自己来决定的以链表为例讲解为什么需要类用户修改了你的链表,暴露给所有人创建和销毁,忘记了,内存泄漏冗长的名字封装分离实现细节和接口一定要把细节private接口public接口修改调用我们是知道的......
  • hdu:Ice Cream Tower(构造二分)
    一座高度为k的塔\(b1,b_2,\dots,b_k\)满足\(2b_1\leqb_2,2b_2\leqb_3,2b_3\leqb_4,\dots,2b{k-1}\leqb_k\)你要从中选择一些数来叠很多座高度为\(k\)的塔,问最多能叠多少座塔。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,k(2......
  • hdu:序列划分(构造二分)
    ProblemDescription给定\(n\)个正整数\(a_1,a_2,\dots,a_n\),将这个序列从左到右划分成\(m\)段,使得每段至少有一个数。你需要让数字之和最大的那一段的数字和尽可能得小。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,m(1≤m≤......
  • matlab 构造逐渐震荡衰减的函数
    t=0:0.01:10;%时间范围freq=5;%振荡频率amp=1;%初始振幅duration=5;%振荡持续时间decay_rate=0.1;%衰减速率y=amp*sin(2*pi*freq*t).*exp(-decay_rate*t);%构造函数plot(t,y);%绘制图形xlabel('时间');ylabel('振幅');title('逐渐震荡衰减函数');......