C++学习记录——이십유 C++11(2)

news2024/11/13 10:45:46

文章目录

  • 1、类的新功能
    • 1、移动构造和移动赋值
    • 2、default、delete
  • 2、可变参数模板
  • 3、STL容器的emplace


1、类的新功能

1、移动构造和移动赋值

在这里插入图片描述

逐成员按字节拷贝就是浅拷贝。一个类中,如果达成默认移动构造的要求,那么传右值就会使用移动构造了,传左值还是拷贝构造。

2、default、delete

强制生成默认函数。比如自己写了拷贝构造,那么移动构造就不会默认生成,那么就可以用default来强制生成。

Person (Person&& p) = default;//移动构造
Person& operator=(Person&& p) = default;//移动赋值
//原本括号里都是const Person& p

但有些编译器会有别的问题,比如用默认的拷贝构造和赋值,再强制生成默认的移动可能就无法生成,要不都用强制生成,要不自己写拷贝构造和赋值。

delete则是禁止生成默认函数。也是= delete写法。

之前学过的final和override,final会让类不能被继承,成员函数不能被重写;override检查派生类的虚函数是否完成重写。

2、可变参数模板

template <class ...Args>
void show(Args... args)
{
	;
}

三个点就代表可变参数,Args是一个模板参数包,args是一个函数形参参数包,声明一个参数包Args… args,这个参数包中可以包含0到任意个模板参数。传的时候可以传各种类型的参数。比如传一个字符和一个整数,C++11中这里的可变参数也就是类型不同的参数了。

但在函数中的写法也会有所变化

template <class ...Args>
void show(Args... args)
{
	cout << sizeof...(args) << endl;//对于三个点,编译器会自己判断,生成多少个模板参数
}

int main()
{
	show();
	show('x');
	show('x', 'y');
	show('x', 1);
	return 0l;
}

在这里插入图片描述

如何解析可变参数包?typeid不支持使用,不能这样写typeid…(args).name()。

void show()
{
	cout << endl;
}

template <class T, class ...Args>
void show(const T& val, Args... args)
{
	//cout << sizeof...(args) << endl;
	cout << val << " ";
	show(args...);
}

int main()
{
	show();
	show('x');
	show('x', 'y');
	show('x', 1); 
	show('x', 1, string("abcd"));
	return 0l;
}

这里用的递归思维,第一个show调用没有参数的show,所以直接打印空;第二个就是调用带参数的show,字符x传给val,而参数包此时就是0个参数。第三个开始就是多个参数传过去,val是字符x,参数包是字符y,第一次打印完val,然后再次调用show,此时传过去args…,那么val就是y,参数包是0个参数。

可以看调用了多少次。

void show()
{
	cout << endl;
}

template <class T, class ...Args>
void show(const T& val, Args... args)
{
	//cout << sizeof...(args) << endl;
	cout << __FUNCTION__ << "(" << sizeof...(args) << ")" << endl;
	cout << val << " ";
	show(args...);
}

int main()
{
	//show();
	//show('x');
	//show('x', 'y');
	//show('x', 1); 
	show('x', 1, string("abcd"));
	return 0l;
}

在这里插入图片描述

C++的线程会用到这个可变参数包。

还有这样的写法

template<class T>
void PrintArg(T t)
{
	cout << t << " ";
}

template<class ...Args>
void show(Args... args)
{
	int arr[] = { (PrintArg(args), 0)... };
	cout << endl;
}

int main()
{
	show(1, 'A', string("abcd"));
	return 0;
}

在这里插入图片描述
后面的三个点是必须要写的形式,用了逗号表达式,逗号表达式取右边的,因为要初始化这int数组,所以这个0,变成什么数字都可以,如果不加这个逗号表达式,直接写int arr[] = {PrintArg(args)… } 然后在PrintArg函数里写上return 0即可。把三个点放在括号外面可以一个个传过去,具体传多少,编译器知道有多少个模板参数;如果是放在括号里args…,那就是全部传了过去,那就不对了。

在编译器里就变成这样。

void show(char a1, char a2, sting a3)
{
    int arr[] = {PrintArg(a1), PrintArg(a2), PrintArg(a3)};
	cout << endl;
}

可变参数包让编译器的负担加重了。

实际写的时候更倾向于Args&&… args,在模板这样的引用就是万能引用,也就是引用折叠,因为传自定义类型的时候,像string,就会是传值引用

3、STL容器的emplace

库中的类的插入部分添加了emplace_back这样的函数,它就用了可变参数包,在普通插入方面push_back其实没有太多区别,用法也都一样,但在传入临时变量会有一定区别,比如在list中emplace_back(“asdasda”),这时候push_back就是先构造匿名对象再传参到右值版本,然后移动构造转移资源;而emplace_back则是直接构造,它会推导成char*类型,然后往下传给要添加的节点,最后构造。

深拷贝的类差别不大,移动构造有一定差距,浅拷贝时,像日期类,如果传右值,差距不大,但是传左值。emplace不能接收初始化的列表,比如{2023, 8, 26},但是可以emplace_back(Date(2023, 8, 26))和emplace_back(2023, 8, 26)是可以的,这两个就是构造+移动构造和直接构造。

本篇gitee

结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

022-从零搭建微服务-短信服务(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

Docker镜像的私有定制之nginx

一、背景 机器上已有nginx的可执行文件&#xff0c;但它是基于官方源码进行修改过的&#xff0c;可模块的源码一时找不到。另外&#xff0c;每次都基于源码去构建&#xff0c;对于Nginx部署也是麻烦。 所以&#xff0c;我们想要改为docker容器化部署nginx。 操作系统是centos…

STL-常用容器-map/ multimap容器(二叉树-红黑树)

1 map基本概念 简介&#xff1a; Map是一种关联容器&#xff0c;它通过将键和值成对存储&#xff0c;实现了快速的键值查找。在Map中&#xff0c;每个键都是唯一的&#xff0c;而值可以重复。Map容器内部使用平衡二叉树&#xff08;通常是红黑树&#xff09;的数据结构来实现高…

HodlSoftware-免费在线PDF工具箱 加解密PDF 集成隐私保护功能

HodlSoftware是什么 HodlSoftware是一款免费在线PDF工具箱&#xff0c;集合编辑 PDF 的简单功能&#xff0c;可以对PDF进行加解密、优化压缩PDF、PDF 合并、PDF旋转、PDF页面移除和分割PDF等操作&#xff0c;而且工具集成隐私保护功能&#xff0c;文件只在浏览器本地完成&…

OpenCV基础知识(8)— 图形检测

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状&#xff0c;然后对这些形状进行描绘&#xff0c;例如搜索并绘制图像的边缘&#xff0c;定位图像的位置&#xff0c;判断图像中有没有直线、…

【面向大一新生IT技术社群招新啦,不来瞅瞅?】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生 &#x1f43b;‍❄️个人主页&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;落798. &#x1f54a;️系列专栏&#xff1a;【零基础学java】 ----- 【重识c语言】 ---- 【计算机网络】—【Spri…

Fortran 微分方程求解 --ODEPACK

最近涉及到使用Fortran对微分方程求解&#xff0c;我们知道MATLAB已有内置的函数&#xff0c;比如ode家族&#xff0c;ode15s&#xff0c;对应着不同的求解办法。通过查看odepack的官方文档&#xff0c;我尝试使用了dlsode求解刚性和非刚性常微分方程组。 首先是github网址&am…

代码随想录算法训练营第四十六天|LeetCode 1143,1035,53

目录 LeetCode 1143.最长公共子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 1035.不相交的线 LeetCode 53.最大子序列和&#xff08;动态规划&#xff09; 动态规划五步曲&#xff1a; 1.确定…

【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 SidePanel 侧边栏&#xff0c;如下图 …

【软件安装】Python安装详细教程(附安装包)

软件简介 Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计&#xff0c;作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本质&#xff0c…

Dynamic CRM开发 - 使用XrmToolbox工具创建自动编号

有时需要为实体创建自动编号,可以使用XrmToolbox工具。 下载XrmToolbox(https://www.xrmtoolbox.com/) 解压后打开XrmToolBox.exe,如下图: 打开后界面如下: 在“Tools”选项卡中找到Auto Number Manager工具</

麒麟OS国产系统身份证阅读器web网页开发使用操作流程

1、打开麒麟软件商店&#xff0c;选择驱动&#xff0c;找到身份证阅读器&#xff0c;找到东信智能身份证社保卡读卡器&#xff0c;点击安装。 2、安装完成后&#xff0c;点击打开 3、进入读卡界面 4、进入代码集成 <script type"text/javascript">var ctnFin…

A股自动交易,自动止盈止损,自动打板

一、前言 炒股的都知道&#xff0c;股市里最难克服的就是人性。开发这个项目的初衷即是想通过机器来克服人性的弱点。因为只要把策略定好&#xff0c;机器会无条件挂单。该止损止损&#xff0c;该止盈止盈。 短线的话卖比买更重要&#xff1a;复盘就会发现&#xff0c;大的亏…

算法通关村第十关——快速排序算法

1 快速排序基本过程 快速排序的是将分治法运用到排序问题的典型例子。力扣912题&#xff0c;给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 基本思想&#xff1a;是通过随机标记一个pivot元素将含有n个元素的序列划分为左右两个子序列left和right&#xff0c;其中…

验证码服务(使用提供好的项目)

1、先生成一个指定位数的验证码&#xff0c;根据需要可能是数字、数字字母组合或文字。 2、根据生成的验证码生成一个图片并返回给页面 3、给生成的验证码分配一个key&#xff0c;将key和验证码一同存入缓存。这个key和图片一同返回给页面。 4、用户输入验证码&#xff0c;连…

什么是 DALI 协议?

在照明行业&#xff0c;我们常常听到 DALI 的名号&#xff01;那么&#xff0c;到底什么是 DALI 呢&#xff1f;那么今天&#xff0c;我们就来一起入门&#xff0c;揭开 DALI 的神秘面纱~什么是 DALI 协议&#xff1f; DALI &#xff0c;实际上是一个简称&#xff01;它的全程如…

向阳而生的智慧光伏设施

光伏发电太阳花装配双轴自动追踪器&#xff0c;会根据当前的经纬度和时间&#xff0c;实时计算太阳的方位角和高度角&#xff0c;计算出光伏板应当运行的角度&#xff0c;于倾角传感器的当前角度 比较&#xff0c;当二者的误差超过 1时&#xff0c;发出电机运转指令&#xff0c…

程序填空技巧1.0

程序填空要先知道这个程序要干什么&#xff0c;然后找到标准模板后对照模板填写&#xff0c;但当然不是让你做题的时候对照模板写&#xff0c;而是要把每种算法的标准模板背下来&#xff0c;但你肯定要问&#xff1a;邹邹&#xff0c;我哪里来的模板呢&#xff1f;&#xff1f;…

租赁小程序开发|免押租赁系统包含哪些功能?

租赁小程序是一种基于现代技术的创新解决方案&#xff0c;为租赁业务提供了全面的管理功能。通过这个小程序&#xff0c;您可以方便地组织和跟踪您的库存情况&#xff0c;轻松管理租赁合同以及处理订单。这一切都在您的指尖之间&#xff0c;让您节省时间和精力&#xff0c;专注…