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

cpp primer笔记100-拷贝控制

  1. 如果拷贝构造函数如果传递的参数不是引用类型,则调用拷贝永远不成功,因为如果调用了拷贝构造函数,则必须拷贝它的实参,但是为了拷贝实参,我们又需要调用拷贝构造函数,如此循环。

  2. 如果想要删除默认构造函数,默认拷贝构造函数,默认赋值运算符,可一直接在声明函数后面加上=delete,但是析构函数最好不要被删除,否则无法释放对象内存。

    #include<string>
    #include<cstring>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<functional>
    #include<unordered_set>
    #include<unordered_map>
    using namespace std;
    class numbered
    {
    public:int a, b, c;numbered() = delete;numbered(int x, int y, int z) :a(x), b(y), c(z) {};
    };
    signed main()
    {numbered num1(1, 2, 3);//numbered num2; 默认构造函数被删除无法使用}
    

    ![[Pasted image 20230923211325.png]]

  3. shared_ptr的引用计数:
    ![[Pasted image 20230923220043.png]]

  4. 由于右值引用只能绑定到临时对象,所以右值引用的对象将要被销毁,而且该对象没有其他变量使用。如果想让一个左值转换为对应的右值引用类型,可以通过std::move函数来调用,右值引用注意一下几点:

    • 一旦完成资源的移动,移后原对象处于销毁无害状态,原对象必须不在指向被移动的资源,这些资源所有权已经归属新创建的对象。

    • 如果一个函数被noexcept修饰,则如果这个函数抛出异常,则程序无论能否被catch捕获会中断执行,而没有被该关键词修饰的函数则可能被catch捕获然后继续执行catch和catch后面的代码。移动构造函数需要notexcept修饰的原因是,如果在对vector进行push_back重新分配空间时,移动失败的话vector内的元素会发生改变,可能已经不存在,导致程序后面发生错误,拷贝失败的话,vector旧元素并不发生改变,vector原有元素还是会存在的。

    • 移动构造函数基本是针对指针进行操作的,移动是将原有的指针指向的位置传递给新的指针,并且将原有的指针置空,拷贝是将原有的指针指向的数据copy一份给新的指针,所以移后原对象基本可以说是报废不可用,所以说不建议对移后原对象进行操作。当然将指针置空还有另一个原因,就是如果两个对象的指针都指向同一个地址,则会导致同一个地址的指针被delete多次导致报错,所以需要将指针置空

    • ![[Pasted image 20230924130706.png]]

    • 当一个类既有移动构造函数,又有拷贝构造函数的时候,如果传入的参数是非静态右值,则使用移动构造函数,否则使用拷贝构造函数,如果一个类只有拷贝构造函数,则包括右值在内的所有类型参数使用拷贝构造函数。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <iostream>
    #include <fstream>
    #include <array>
    #include <vector>
    #include <string>
    #include <exception>
    #include <algorithm>
    #include <deque>
    #include <numeric>
    #include <memory>
    #include <initializer_list>
    #include <exception>
    #include <cstring>
    class StrVec
    {
    private:char* str = nullptr;int len = 0;
    public:StrVec(const char* s){len = std::strlen(s);str = new char[len + 1];std::strcpy(str, s);}StrVec(const StrVec& s){if (s.str != nullptr){len = s.len;delete str;str = new char[len + 1];std::strcpy(str, s.str);}}StrVec(StrVec&& s) noexcept{std::cout << "调用移动构造函数" << std::endl;if (s.str != nullptr){len = s.len;delete str;str = s.str;s.str = nullptr;}}StrVec& operator=(const StrVec& s){if (this != &s){delete str;len = s.len;str = new char[len + 1];std::strcpy(str, s.str);}return *this;}StrVec& operator=(StrVec&& s) noexcept{throw "werwer";if (this != &s){delete str;len = s.len;str = s.str;s.str = nullptr;}return *this;}friend std::ostream& operator<<(std::ostream& os, const StrVec& val){os << val.len << " " << val.str;return os;}
    };
    int main()
    {//int&& rr1 = 42;//正确:字面常量是右值int&& rr2 = rr1; 错误不能将一个右值引用绑定到一个右值引用类型的变量上//int&& rr3 = std::move(rr1);//可以通过move函数来获取左值上的右值引用StrVec a = "aaaaa";StrVec b = "bbbbb";StrVec c = "ccccc";StrVec d = "ddddd";try{std::cout << a << " " << b << " " << c << " " << d << std::endl;b = a;StrVec e = a;std::cout << a << " " << b << " " << c << " " << d << " " << e << std::endl;StrVec f = std::move(b);d = std::move(e);std::cout << a << " " << c << " " << d << " " << " " << f << std::endl;}catch (...){std::cout << "抛出异常";}return 0;
    }
    
  5. 多个功能类似的函数可以组合成一个函数表,便于调用,但是使用关联容器作为函数表可能无法存入函数类对象,所以引入function函数来出入对象

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<iostream>
    #include<map>
    struct  divide
    {int operator()(int denomiator, int divisor){return denomiator / divisor;}divide(int) {};
    };
    int add(int i, int j) { return i + j; }
    int main()
    {auto mod = [](int i, int j) {return i % j; };std::map<std::string, int(*)(int, int)> binops;binops.insert({ "+",add });binops.insert({ "%",mod });//lambda在没有捕获任何变量的情况下赋值为函数指针,而不是函数闭包//如果在捕获情况下传入则会编译错误//binops.insert({ "/",divide }); 错误std::cout << binops["%"](10, 4);return 0;
    }
    2
    
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>
#include<functional>
#include<algorithm>
struct divide
{int operator()(int denomiator, int divisor){return denomiator / divisor;}
};
int add(int i, int j) { return i + j; }
int func(int i, int j) { return 2 * i + j; }
int func(int i, int j, int k) { return 3 * i + 2 * j + k; }
int main()
{auto mod = [](int i, int j) { return i % j; };std::map<std::string, std::function<int(int, int)>> binops;binops.insert({ "+",add });binops.insert({ "/",divide() });binops.insert({ "-",std::minus<int>() });binops.insert({ "*",[](int i,int j) {return i * j; } });binops.insert({ "%",mod });//binops.insert({ "func",func }); 错误不能直接写重载函数名binops.insert({ "func",[](int i,int j) {return func(i,j); } });//通过lambda代替std::ostream_iterator<int> os(std::cout, "\n");os = binops["+"](10, 5);os = binops["/"](10, 5);os = binops["-"](10, 5);os = binops["*"](10, 5);os = binops["%"](10, 5);return 0;
}
15
2
5
50
0

![[Pasted image 20230924155429.png]]

相关文章:

cpp primer笔记100-拷贝控制

如果拷贝构造函数如果传递的参数不是引用类型&#xff0c;则调用拷贝永远不成功&#xff0c;因为如果调用了拷贝构造函数&#xff0c;则必须拷贝它的实参&#xff0c;但是为了拷贝实参&#xff0c;我们又需要调用拷贝构造函数&#xff0c;如此循环。 如果想要删除默认构造函数…...

【数据库——MySQL】(16)游标和触发器习题及讲解

目录 1. 题目1.1 游标1.2 触发器 2. 解答2.1 游标2.2 触发器 1. 题目 1.1 游标 创建存储过程&#xff0c;利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现) 创建存储过程&#xff0c;将某部门的员工工资按工作…...

javascript二维数组(9)toString的用法

在JavaScript中&#xff0c;toString() 是一个内置方法&#xff0c;用于将特定的对象转化为字符串表示形式。 基本使用示例 以下是一些 toString() 方法的基本使用示例&#xff1a; 数字的 toString()&#xff1a; let num 123; console.log(num.toString()); // 输出: &…...

OpenAI重大更新!为ChatGPT推出语音和图像交互功能

原创 | 文 BFT机器人 OpenAI旗下的ChatGPT正在迎来一次重大更新&#xff0c;这个聊天机器人现在能够与用户进行语音对话&#xff0c;并且可以通过图像进行交互&#xff0c;将其功能推向与苹果的Siri等受欢迎的人工智能助手更接近的水平。这标志着生成式人工智能运动的一个显著…...

【开发篇】十六、SpringBoot整合JavaMail实现发邮件

文章目录 0、相关协议1、SpringBoot整合JavaMail2、发送简单邮件3、发送复杂邮件 0、相关协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;&#xff1a;简单邮件传输协议&#xff0c;用于发送电子邮件的传输协议POP3&#xff08;Post Office Protocol - Versi…...

如何在Ubuntu系统部署RabbitMQ服务器并公网访问【内网穿透】

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...

Flutter笔记:用于ORM的Floor框架简记

Flutter笔记 用于ORM的Floor框架简记 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133377191 floor 模块地址&#xff1a;https://pub.dev/packages/floor 【介绍】&#xff1a;最近想找用于Dart和Flutter的ORM框架&#xff0c;偶然间发现了Floor…...

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…...

【Spatial-Temporal Action Localization(五)】论文阅读2020年

文章目录 1. Actions as Moving Points摘要和结论引言&#xff1a;针对痛点和贡献模型框架实验 1. Actions as Moving Points Actions as Moving Points (ECCV 2020) 摘要和结论 MovingCenter Detector (MOCdetector) 通过将动作实例视为移动点的轨迹。通过三个分支生成 tub…...

Linux基本指令(中)——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容是Linux基本指令呀&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; cp指令&#xff08;重要&#xff09; mv指令&#xff08;重要&#xff09…...

OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击

作者&#xff1a;gentle_zhou 原文链接&#xff1a;OWASP Top 10漏洞解析&#xff08;3&#xff09;- A3:Injection 注入攻击-云社区-华为云 Web应用程序安全一直是一个重要的话题&#xff0c;它不但关系到网络用户的隐私&#xff0c;财产&#xff0c;而且关系着用户对程序的新…...

Java自定义类加载器的详解与步骤

自定义类加载器的步骤 继承ClassLoader类&#xff1a;首先创建一个新的类&#xff0c;该类需要继承ClassLoader类。可以通过直接继承ClassLoader或是间接继承URLClassLoader等子类来实现。重写findClass()方法&#xff1a;在自定义类加载器中&#xff0c;最重要的是重写findCl…...

完美清晰,炫酷畅享——Perfectly Clear Video为你带来卓越的AI视频增强体验

在我们日常生活中&#xff0c;我们经常会拍摄和观看各种视频内容&#xff0c;无论是旅行记录、家庭聚会还是商务演示&#xff0c;我们都希望能够呈现出最清晰、最精彩的画面效果。而现在&#xff0c;有一个强大的工具可以帮助我们实现这一目标&#xff0c;那就是Perfectly Clea…...

如何让FileBeat支持http的output插件

目录 1 缘由2 编译filebeat3 配置虚拟机访问外网4 编译beats-output-http4.1 使用本地包4.2 发布在线包 5 测试6 beats-output-http的部分解释 1 缘由 官网的filebeat只有以下几种output插件&#xff1a; Elasticsearch ServiceElasticsearchLogstashKafkaRedisFileConsole …...

解密人工智能:决策树 | 随机森林 | 朴素贝叶斯

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、决策树2.1 优点2.2 缺点 三、随机森林四、Naive Bayes&#xff08;朴素贝叶斯&#xff09;五、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法&#xff0c;通过对…...

web:[极客大挑战 2019]BabySQL

题目 点进页面显示如下 查看源代码 先尝试一下万能密码 没用&#xff0c;or被过滤了 试着双写看看 回显一串&#xff0c;也不是flag 先查询列数尝试一下&#xff0c;把union select过滤了&#xff0c;使用双写 构造payload /check.php?usernameadmin&password1 %27 ununi…...

DRM全解析 —— plane详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(5)——plane分析 特此致谢&#xff01; 1. 简介 一个plane代表一个image layer&#xff08;硬件图层&#xff09;&#xff0c;最终的image由一个或者多个plane(s)组成。plane和 Framebuffer 一样是内存地址。…...

数据结构总结

数据结构 相关博文 单链表数组模拟单链表-CSDN博客双链表数组模拟双链表-CSDN博客栈及单调栈数组模拟栈以及单调栈-CSDN博客队列及单调队列数组模拟队列以及单调队列-CSDN博客KMPKMP详细算法思路-CSDN博客TrieTire树的理解-CSDN博客并查集并查集&#xff08;面试常考&#xff…...

在SOLIDWORKS搭建一个简易的履带式机器人

文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期&#xff0c;在solidworks中搭建了一个履带式机器人小车&#xff0c;计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板&#xff08;a面&#xff09…...

C# 为什么要限制静态方法的使用

前言 在工作了一年多之后&#xff0c;我发现静态方法的耦合问题实在是头疼。如果可以尽量不要使用静态方法存储数据&#xff0c;如果要存储全局数据就把数据放在最顶层的主函数里面。 静态方法问题 耦合问题&#xff0c;不要用静态方法存储数据 我这里有两个静态方法&#…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...