当前位置: 首页 > 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;不要用静态方法存储数据 我这里有两个静态方法&#…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...