C++ 右值引用 使用笔记

C++ 左值、右值、左值引用、右值引用 本文介绍C++11的各种引用的概念,理解清楚各种引用的概念,非常有助于理解基于c11引用的各种操作。 阅读详情

环境VS2017


构造一个矩阵类

class Matrix {
private:
	int** _data;	//default value is 0
	int lines = 0;
	int rows = 0;
public:
	Matrix(int li, int ro);	//lines=li, rows=ro
	Matrix(const Matrix& original);	//copy
	Matrix(Matrix&& rhs);	//move copy
	~Matrix();
	void init();	//calls cin, linear input
	void output();	//calls cout, linear output
	Matrix operator+(const Matrix& other);
	Matrix operator-(const Matrix& other);
	Matrix& operator=(const Matrix& other);
	Matrix& operator=(Matrix&& rval);	//move assign
};
其中:

Matrix::Matrix(Matrix&& rhs) {
	this->lines = rhs.lines;
	this->rows = rhs.rows;
	this->_data = rhs._data;
	rhs._data = nullptr;
}
Matrix Matrix::operator+(const Matrix& other) {
	Matrix result(this->lines, this->rows);
	for (int li = 0; li < lines; li++) {
		for (int ro = 0; ro < rows; ++ro) {
			result._data[li][ro] = this->_data[li][ro] + other._data[li][ro];
		}
	}
	return result;
}

Matrix& Matrix::operator=(Matrix&& rhs) {
	this->_data = rhs._data;
	rhs._data = nullptr;
	return *this;
}


语句 A3=A1+A2过程:

A1 成员函数operator+ 被调用,该函数在栈上有一个保存结果的临时变量(名字为result),当计算完毕后,执行 return 语句。

return 语句执行过程是,首先 调用了移动复制构造函数生成临时变量(设名为 Ax)把result 内容夺走,此变量在调用operator+函数的栈中。

return 结束,operator+ 弹栈,result 析构被调用(判断空指针避免read access 错误)。

operator+ 弹栈完成。返回调用函数语句 A3=A1+A2;

现在等号右边是一个名副其实的 “匿名变量”(Ax),毫无疑问此时调用的是 移动赋值而不是 复制构造函数。


移动语义的好处在于节省C++中复制构造函数被过分调用,缺点在于程序员要小心被夺取内容的右值的析构等问题。


有点让我意外的是,result 是有名字的变量,却被当作右值来处理。看来 右值引用不只匹配匿名临时变量,此例发现还匹配函数栈上的局部变量。





保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑 本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。 阅读详情

相关推荐

@transactional滥用导致数据源连接池耗尽问题

@transactional滥用导致数据源连接池耗尽问题

qq_43205267的博客 1198

C++11 的右值引用(Rvalue reference)——细微却最重要的改动

转载自 @知乎  作者@Tinro  如何评价 C++11 的右值引用(Rvalue reference)特性? 个人认为,右值引用是C++11中最细微却最重要的改动。即使不直接使用,也一样能够从中受益。同时右值引用还使更多的标准库功能成为可能,例如std::unique_ptr、std::function等。 @王潜升 提到栈区对象的问题,只是右值引用解决的问题之一。更全面一

Ye_create 4310

避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节

本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。

weixin_42741930的博客 246

C++右值引用

C++右值引用

GreatTang的博客 3832

[漏洞利用]利用五次Shift越权破解win7\win10开机密码

注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\

Y4tacker的博客 2万+

代码生成 | 安时积分法模型搭建

安时积分法是电池电量计量最基础的方法,今天我们用simulink建模的方式做一个安时积分模型,从而更好地理解安时积分的思想也掌握建模的基础操 ​新建文件 打开MATLAB启动simulink新建一个模型文件 定义变量 和手写代码一样,先定义几个后面要用到的变量,在simulink建模时新建变量用Data Store Memory模块。双击填入要定义的变量名,然后在signal attributes赋初值 如此方法新建四个变量current(电流)初值1000mA、tatol_cap(总容量

ningvay的博客 1万+

详解—C++右值引用

而临时对象也是右值,因此在用临时对象构造s3时,也采用移动构造,将临时对象中资源转移到s3中,整个过程,只需要创建一块堆内存即可,既省了空间,又大大提高程序运行的效率。2. const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值。C++98中引用作用:因为引用是一个别名,需要用指针操作的地方,可以使用指针来代替,可以提高代码的可读性以及安全性。

weixin_55582891的博客 5263

化工设备应力分析软件:STAAD.Pro二次开发_(24).非线性分析技术

在STAAD.Pro 中,可以通过命令。

kkchenjj的博客 659

C++知识篇--右值引用

C++知识--左值、右值

仰望星空 3514

3.3 数据导入与导出方法

Simulink 提供了多种数据导入与导出方法,能够满足不同场景下的需求。无论是从 MATLAB 工作区或外部文件导入数据,还是将仿真结果导出到工作区或文件,这些功能都极大地增强了模型的灵活性和实用性。掌握这些方法后,用户可以更高效地完成复杂系统的建模与分析任务。

xiaoheshang_123的博客 317

汇川H5U PLC 实现直线插补、圆弧插补、直线圆弧混合连续插补

使用汇川H5UPLC实现直线插补,圆弧插补,直线圆弧混合路径插补,通过示教可以走出复杂的路径,仅供参考学习。

weixin_39832501的博客 4773

【基础知识】C++左值右值

C++中,并不是所有情况下 && 都代表右值引用,在模板和自动类型推导(auto)中,如果是模板参数,想要指定为 T&&,如果是自动类型推导,需要指定为 auto&&,这两种情况下,&& 被称作“未定的引用类型”。C++11 添加了右值引用,却不能左值初始化右值引用,在一些特定的情况下免不了需要左值初始化右值引用(用左值调用移动构造),如果想要用左值初始化一个右值引用,想要借助 std::move() 函数,move() 函数可以。当 T 不是左值引用类型时,t 将会被转换为 T 类型的右值。

m0_56573171的博客 3504

【Altium designer】如何添加过孔阵列

按下图1指示,执行【Tool】菜单栏下【Via Stitching/Shielding】选项卡中的【Add Stitching to Net...】选项 图1 “添加过孔阵列”选项 点击【Add Stitching to Net...】选项后,会跳出一个窗口,让我们设置过孔阵列的参数信息,如下图2所示。 图2 过孔阵列参数设置 过孔阵列区域:勾选该选项框,即可绘制多边形区域; 过孔内径与焊盘直径:比如内径 【Hole Size】设为12mil,焊盘直径【Diameter】设为24mil; .

夜半少年的博客 2万+

【c++复习笔记】——右值引用(概念,使用场景),移动拷贝构造函数,赋值拷贝构造函数。

​ 💂 个人主页:努力学习的少年 🤟 版权: 本文由【努力学习的少年】原创、在优快云首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 ​

sjp11的博客 6039

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)

右值没有内存实体,一般不能对其进行调用成员函数或赋值,但有时会出现以下情况:即右值调用成员函数或对右值进行赋值;上述代码其实是没意义的,但 C++11 仍然保留了这种右值赋值或调用成员函数的机制;移动一个对象可能会销毁原对象,当确信一个算法为一个元素赋值或传递给函数后。(即将被销毁的对象),即所引用的对象将要被销毁,对象没有其他用户;的函数,连同算术、关系、位已经后置递增/递减运算符,都生成右值;右值引用必须绑定到右值的引用,通过。移动构造函数必须确保移动后,,才能使用移动迭代器将对象传递给算法;

牵一只蜗牛去散步 546

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ primer plus学习笔记(二)——类、左值引用、右值引用、万能引用

C++也是支持面向对象的语言,也有类的概念。与java差异比较大的是,没有gc(垃圾回收器),所以设计要考虑好释放,不过也提供了智能指针(自动计数引用,自动释放)。 代码风格 前面去了解vector的源码,发现大部分头文件都会使用这种方式来避免被重复导入代码 #ifndef XXX_H #define XXX_H 1 code... #endif 一般头文件都会这样用文件名做一个宏定义的预处理,...

weixin_44627989的博客 958

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

详解 C++ 左值、右值、左值引用以及右值引用

主要讲解了 C++11 的右值引用(及其支持的移动语义和完美转发)。

Butayarou的博客 2万+

C++11 左值、右值、右值引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。

Hyman's Blog 4万+

【C++】C++11右值引用

今天我们正式进入C++11的学习,C++11引入的一个非常重要的语法就是右值引用,在C++11之前的C++版本我们所提的引用都是左值引用,那么右值引用与左值引用又有什么区别呢?什么是左值?什么是右值?右值引用的价值体现在哪里?那么接下来我们就来学习有关右值引用的相关知识。

℉f的博客 2247

详解C++中右值引用

98中的引用 概念 特性 引用的使用场景 三种传参方式效率的比较 探索:引用的底层实现方式----->指针 T&------>T* const const T&---->const T*const 引用和指针的区别 引用的总结 11中的右值引用 为什么要有右值引用 为了提高程序运行效率,C++11中引入了右值引用,右值引用也是别名,但其只能对右值引用 i...

LXY的博客 6887

C++中左值引用与右值引用的区别

1.左值和右值 首先,左值和右值是表达式的属性。C++中的表达式,不是左值就是右值。左值可以位于赋值语句的左侧,而右值则不能;可以做一个简单的归纳:当一个对象被用作右值的时候,用的是对象的值;当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。需要右值的地方可以用左值代替,但不能把右值当成左值使用。 介绍完左值右值,接下来介绍左值引用和右值引用。 2.左值引用 左值引用就是我们平常使用的“...

Kyson_的博客 9051

C++笔记---右值引用

左值(lvalue)左值是指可以放在赋值号(=)左边的表达式,它代表一个可以被引用的内存位置。左值通常是变量名、数组元素、解引用的指针等。左值具有持久性,可以被多次引用和修改。右值(rvalue)右值是指只能放在赋值号(=)右边的表达式,它代表一个临时的值,通常是字面量、函数返回值、表达式的结果等。右值不具有持久性,一旦被使用就会被丢弃。左值与右值的核心区别就在于能否取地址。

2302_80372340的博客 1497

C++左值、右值、左值引用、右值引用

#include <iostream> #include <vector> #include <string> #include<utility> using namespace std; class A { public: A() { a = 666; cout << "构造A" << endl; } A(const A&a) { cout << "拷贝构造A" << endl; .

DayDayUp 3430

C++面试 左值、右值、左值引用、右值引用

1、左值和右值 左值(left-values),缩写:lvalues ,located value 可定位值,其含义是可以明确其存放地址的值,更确切说对其的使用是基于地址 右值(right-values),缩写:rvalues , read value 可读的值,通常指代赋值运算=右侧的常量值,字面值,或者函数的返回值,它们没有具体的指代名,即无法通过地址访问,通常在赋值表达式结束后变销毁。 一般可以认为:左值对应变量的地址,右值对应变量的值,首先说左值和右值,他们绝不是简单的等号左边和右边的..

u014430031的博客 4113

【C++11】右值引用

关于左值,右值引用的介绍

喜欢编写一些小程序的科班菜鸟,但是由于准备考研,博客不能及时更新了,不好意思! 2424

C++11:右值引用

讲解C++11新特性,右值引用

博客网站 https://async-area.com 1380
上一篇: 习题- 二分法/牛顿迭代法 求算术平方根
下一篇: new/delete 和 复制构造函数
NameOfBlog
博客等级 码龄9年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值