当前位置: 首页 > news >正文

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

目录

1--右值引用

2--std::move

3--移动构造函数

4--移动赋值运算符

5--移动迭代器

6--引用限定符


1--右值引用

        右值引用必须绑定到右值的引用,通过 && 获得右值引用;

        右值引用只能绑定到临时对象(即将被销毁的对象),即所引用的对象将要被销毁,对象没有其他用户;

        返回非引用类型的函数,连同算术、关系、位已经后置递增/递减运算符,都生成右值;

int i = 42;
int &r1 = i; // 左值引用,i是一个变量,是左值
int &&r2 = i * 42; // 右值引用,i*42是一个临时对象,是右值 

2--std::move

        std::move 用于获得绑定到左值上的右值引用,其定义在头文件 utility 中;

int &&r1 = 42; // 右值引用,但r1是一个左值
int &&r2 = std::move(r1); // 调用std::move,调用后只能对r1进行赋值或销毁,不能再使用

3--移动构造函数

        移动构造函数的第一个参数是该类类型的一个右值引用

        移动构造函数必须确保移动后,销毁源对象是无害的;

        移动构造函数不分配任何新内存,只是接管给定的内存;

A::A(A &&s) noexcept : data1(s.data1), data2(s.data2), data3(s.data3){s.data1 = s.data2 = s.data3 = nullptr;
}
// 假定data1,data2 和 data3 均是指针
// noexcept 的作用是通过标准库对于上述构造函数不抛出任何异常
// 在移动构造函数的函数体中,对源对象的指针数据进行赋值,可以避免由于源对象析构导致释放刚刚移动的内存的问题

4--移动赋值运算符

A &A::operator=(A &&sample) noexcept{if(this != &sample){data1 = sample.data1;data2 = sample.data2;data3 = sample.data3;sample.data1 = sample.data2 = sample.data3 = nullptr;}return *this;
}

5--移动迭代器

        移动迭代器的解引用运算符生成一个右值引用,通过调用标准库的 make_move_iterator 函数可以将一个普通迭代器转换为一个移动迭代器;

        移动一个对象可能会销毁原对象,当确信一个算法为一个元素赋值或传递给函数后不会再访问原对象,才能使用移动迭代器将对象传递给算法;

#include <iostream>     
#include <iterator>          
#include <string>       
#include <vector>int main (int argc, char *argv[]){std::vector<std::string> foo (3);std::vector<std::string> bar {"A", "B", "C"};typedef std::vector<std::string>::iterator Iter;std::copy ( std::move_iterator<Iter>(bar.begin()), // 使用移动迭代器std::move_iterator<Iter>(bar.end()),foo.begin() );bar.clear(); // 移动 bar 后,清理std::cout << "foo:";for (std::string& x : foo) std::cout << ' ' << x;std::cout << std::endl;;return 0;
}

6--引用限定符

        右值没有内存实体,一般不能对其进行调用成员函数或赋值,但有时会出现以下情况:即右值调用成员函数或对右值进行赋值;

string s1 = "abc", s2 = "def";
auto n = (s1 + s2).find('a'); //(s1 + s2)是一个右值,对右值调用成员函数
s1 + s2 = "wc"; //(s1+s2)是一个右值,对右值赋值

        上述代码其实是没意义的,但 C++11 仍然保留了这种右值赋值或调用成员函数的机制;通过使用引用限定符可以显式阻止函数被左值或右值调用:

class demo{int get_num();   // 默认情况下,成员函数既可以被左值或右值对象调用int get_num()& ;  // &显式限制成员函数必须被左值成员对象调用int get_num()&& ;  //&&显式限制成员函数必须被右值成员对象调用
}class A{A& operator=(const A&);A& operator=(const A&) &;A& operator=(const A&) &&;
}

相关文章:

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

目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用&#xff0c;通过 && 获得右值引用&#xff1b; 右值引用只能绑定到临时对象&#xff08;即将被销毁的对象&#xff09…...

【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)

背景需求&#xff1a; 2023年第一学期&#xff08;2023年9-2024年1月&#xff09;&#xff0c;我又被安排为“机动班”&#xff0c;根据新学期的校历&#xff0c;手动推算本学期的机动班的带班表 排版原则 1、班级数量&#xff1a;共有6个班级&#xff0c;循环滚动 2、每周次…...

ChatGPT HTML JS Echarts实现热力图展示

热力图是一种常用的数据可视化图表,主要用于展示数据的分布和密度情况。它通过使用不同颜色的热点来表示数据在地理或二维空间上的分布情况,从而直观地显示出数据的密集程度和趋势。 热力图的功能和作用如下: 1. 数据分布展示:热力图可以将大量数据以热点的形式展示在地理…...

JavaScript七小知

文章目录 1. == 和 ===区别2. a++ 和 ++a区别3. 创建js对象的三种方式4. 原型与原型链相关4.1 prototype4.2 __proto__4.3 constructor4.4 原型链5. 定时器的两种设置方式6. 时间相关7. axios与axios拦截器1. == 和 ===区别 ​ == 只是判断值是否一致, ​ === 会判断数据类型和…...

Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】

Ubuntu【系统环境下】【编译安装OpenCV】【C调用系统opencv库】 前言&#xff1a; 本人需要用C写代码&#xff0c;调用OpenCV库&#xff0c;且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本&#xff0c;所以apt安装OpenCV的版本始终是3.2.0&#xff0c;非常拉胯&#…...

AR界安卓在中国,Rokid引爆空间计算狂潮

击关注 文丨刘雨琦 你可能很难想象&#xff0c;在一个没有显示屏也没有鼠标的空间&#xff0c;仅凭一副AR眼镜和一台口袋主机&#xff0c;就能完成一篇5000字的文章。 没错&#xff0c;8月26日&#xff0c;在2023 Rokid Jungle 新品发布会现场&#xff0c;这样的场景正在真实…...

在 React 中如何使用定时器

在React中使用定时器通常有两种方式&#xff1a;使用setInterval和setTimeout函数。 使用setInterval函数&#xff1a; 首先&#xff0c;在组件中导入useEffect和useState函数&#xff1a; import React, { useEffect, useState } from "react";在组件中声明一个状…...

Unity记录4.6-存储-第四阶段总结

文章首发见博客&#xff1a;https://mwhls.top/4822.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 摘要&#xff1a;存储初步实现的总结 总结-2023/08/19 实现了tile存储&…...

【Python】从入门到上头— 使用包、模块、安装第三方模块(7)

一.什么是模块 在Python中&#xff0c;一个.py文件就称之为一个模块&#xff08;Module&#xff09;。 模块好处&#xff1f;&#xff1a; 方便重用代码&#xff0c;写完一个通用的模块&#xff0c;可以在很多地方直接拿来用相同名字的函数和变量完全可以分别存在不同的模块中…...

flutter和原生利用pigeon建立通道

首先导入依赖&#xff1a; dependencies: pigeon: ^10.0.0定义一个文件&#xff1a; /// 用于定于flutter和平台的桥接方法 /// HostApi() 标记的&#xff0c;是用于 Flutter 调用原生的方法&#xff1b; /// FlutterApi() 标记的&#xff0c;是用于原生调用 Flutter 的方法&…...

TCP连接分析:探寻TCP的三次握手

文章目录 一、实验背景与目的二、实验需求三、实验解法1. 预先抓包监测使用Wireshark工具2.进行TCP三次握手&#xff0c;访问www.baidu.com3.分析Wireshark捕获的TCP包 摘要&#xff1a; 本实验使用Wireshark工具&#xff0c;通过抓包监测和分析&#xff0c;深入研究了与百度服…...

gitHooks使用教程

1. 安装所需依赖 npm install eslint prettier husky lint-staged --save-dev 2.初始化 husky npx husky-init && npm install 这将创建一个 .husky/ 目录&#xff0c;并且在其中包含一个示例的 pre-commit 文件。 3.设置 pre-commit 钩子 npx husky add .husky/…...

2023.8 - java - 数组

声明数组变量 首先必须声明数组变量&#xff0c;才能在程序中使用数组。下面是声明数组变量的语法&#xff1a; dataType[] arrayRefVar; // 首选的方法或dataType arrayRefVar[]; // 效果相同&#xff0c;但不是首选方法int[] a {1,2,3};int b[] new int[10];TS:let a:…...

ChatGPT怎么辅助解决社会问题?

ChatGPT作为一个强大的自然语言处理模型&#xff0c;具有潜力辅助解决多种社会问题。其能力可以应用于信息传递、教育、宣传、意识提高等领域&#xff0c;为社会问题的解决提供支持。以下将详细探讨ChatGPT如何辅助解决社会问题。 **1. 教育与意识提高**&#xff1a; ChatGPT可…...

Rust之自动化测试(一):如何编写测试

开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说&#xff0c;“程序测试可以是一种非常有效的方法来显示错误的存在&#xff0c;但它对于显示它们的不存在…...

简单聊聊Https的来龙去脉

简单聊聊Https的来龙去脉 Http 通信具有哪些风险Https Http SSL/TLS对称加密 和 非对称加密数字证书数字证书的申请数字证书怎么起作用 Https工作流程一定需要Https吗&#xff1f; Http 通信具有哪些风险 使用明文通信&#xff0c;通信内容可能会被监听不验证通信双方身份&a…...

【注册岩土】Python土力学与基础工程计算.PDF-土中的应力

Python 求解代码如下&#xff1a; 1&#xff0e;&#xff03;计算竖向有效自重应力2.h12#m3.h21.5#m4.h31#m5.gamma1 19# kN/m^36.gamma218# kN/m^37.gamma317# kN/m^38.sigma_c gammal * h1 gamma2*h2 gamma3 *h39&#xff0e;print&#xff08;&#xff02;竖向有效自重应力…...

祝贺!Databend Cloud 和阿里云 PolarDB 达成认证

近日&#xff0c;北京数变科技有限公司旗下产品与阿里云 PolarDB 开源数据库社区展开产品集成认证。 测试结果表明&#xff0c;北京数变科技有限公司旗下产品《Databend Cloud&#xff08;V1.25&#xff09;》正式通过了《阿里云 PolarDB 数据库管理软件》的技术认证&#xff…...

SQL语言-01

SQL Structured Query Language 的简单介绍 SQL 中的书写规则 SQL 中的数据类型...

PyCharm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 PyCharm是一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门为Python开发者设计。它是由捷克软件公司JetBrains开发的&#xff0c;为Python开发人员提供了高效、易用和功能丰富的工具集。 以下是PyCharm软件的主要…...

AI文本标注的概念,类型和方法

我们每天都在与不同的媒介&#xff08;例如文本、音频、图像和视频&#xff09;交互&#xff0c;我们的大脑对收集到的信息进行处理和加工&#xff0c;从而指导我们的行为。在我们日常接触到的信息中&#xff0c;文本是最常见的媒体类型之一&#xff0c;由我们交流使用的语言构…...

【AutoLayout案例04-游戏图片-按钮适配 Objective-C语言】

一、好,我们再看一个案例, 刚才,这个案例, 这么一个案例 这个案例,是什么意思呢, 这里给大家做一个3.5英寸、4.0英寸的屏幕适配, 因为我们这里图片,只有一个,就是4英寸的这么一个图片 什么意思呢,要求我们在3.5英寸的屏幕、和4英寸的屏幕的时候,都能正常显示这个图…...

Spring Boot业务系统如何实现海量数据高效实时搜索

1.概述 我们都知道随着业务系统的发展和使用&#xff0c;数据库存储的业务数据量会越来越大&#xff0c;逐渐成为了业务系统的瓶颈。在阿里巴巴开发手册中也建议&#xff1a;单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表&#xff0c;如果预计三年后数据量根本达…...

面向对象的设计原则

设计模式 Python 设计模式&#xff1a;对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计 面向对象 三大特性&#xff1a;封装、继承、多态 …...

前端需要理解的工程化知识

1 Git 1.1 Git 常见工作流程 Git 有4个区域&#xff1a;工作区&#xff08;workspace)、index&#xff08;暂存区&#xff09;、repository&#xff08;本地仓库&#xff09;和remote&#xff08;远程仓库&#xff09;&#xff0c;而工作区就是指对文件发生更改的地方&#xff…...

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...

基于单片机教室人数实时检测系统

一、系统方案 主程序中main函数主要是引脚的初始化&#xff0c;给单片机引脚初始化&#xff0c;初始化LCD1602&#xff0c;初始化红外对管&#xff0c;通过对LCD1602赋值&#xff0c;采集进入教室的人数&#xff0c;显示在LCD1602上面进出人数我们采用按键的形式&#xff0c;检…...

alibabacloud的简单使用,nacos配置中心+服务中心。作者直接给自己写的源码

文章目录 依赖关键主要的程序启动文件配置文件bootstrap.yml依赖文件nacos配置中心上的文件截图 启动成功截图参考文档 依赖关键 SpringBoot版本和com.alibaba.cloud版本需要对应&#xff0c;不然会程序会启动失败作者使用的版本 SpringBoot: 2.1.6.RELEASE alibabacloud: 2.…...

Python爬虫:一个爬取豆瓣电影人像的小案例

从谷歌浏览器的开发工具进入 选择图片右键点击检查 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1b38c2a942c441fb8cb545a28bb35015.png 翻页之后发现网址变化的只有start数值&#xff0c;每次变化值为30 Python代码 import requests from bs4 import BeautifulSou…...

STM32CubeMX配置STM32G0 Standby模式停止IWDG(HAL库开发)

1.打开STM32CubeMX选择好对应的芯片&#xff0c;打开IWDG 2.打开串口1进行调试 3.配置好时钟 4.写好项目名称&#xff0c;选好开发环境&#xff0c;最后获取代码。 5.打开工程&#xff0c;点击魔术棒&#xff0c;勾选Use Micro LIB 6.修改main.c #include "main.h"…...