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

文章目录

  • 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.hqwc.cn/news/83672.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑显示“Operating System not found”该怎么办?

“Operating System not found”是一种常见的电脑错误提示&#xff0c;这类错误会导致你无法成功启动Windows。那么电脑显示“Operating System not found”该怎么办呢&#xff1f; 方法1. 检查硬盘 首先&#xff0c;您可以测试硬盘是否存在问题。为此&#xff0c;您可以采取以…

SpringCloud/SpringBoot多模块项目中配置公共AOP模块实现打印子模块Controller所有请求参数与日志

项目中遇到多个模块需要打印Controller请求日志&#xff0c;在每个模块里面加AOP并且配置单独的切面笔者认为代码冗余&#xff0c;于是乎就打算把AOP日志打印抽离成一个公共模块&#xff0c;谁想用就引入Maven坐标就行。 定义公共AOP模块 并编写AOP工具 AOP模块pom.xml如下 &…

如何保障Facebook账号登录稳定

当谈到保障Facebook账号的稳定性时&#xff0c;我们不得不提到那些令人头疼的情况——Facebook账号被封。尽管我们已经踏入数字化的未来&#xff0c;但是被封号似乎是一个时常困扰着社交媒体用户的问题。那么&#xff0c;让我们来看看一些常见的Facebook账号被封的原因&#xf…

Eureka:服务注册-信息配置-自我保护机制

首先在提供者服务下&#xff0c;添加一个依赖 <!-- Eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version><…

ES6中promise的使用

ES6中promise的使用 本文目录 ES6中promise的使用基础介绍箭头函数function函数状态 原型方法Promise.prototype.then()Promise.prototype.catch() 静态方法Promise.all()Promise.race()Promise.any() 链式回调 基础介绍 官网&#xff1a;https://promisesaplus.com/ window.…

Android进阶之路 - EditText输入字体自适应

遇到这么一个需求&#xff1a;“控件宽度有限&#xff0c;随着输入内容&#xff0c;动态修改字体大小”&#xff0c;如果是你&#xff0c;只如何来实现&#xff1f;又有几种方式&#xff1f; 嗯&#xff0c;就是这么一个简单的需求&#xff0c;让我记录了俩篇blog Android进阶…

象小朋友学识字一样建构战略

战略认知派: 就像小孩子学识字的过程一样【安志强趣讲268期】 趣讲大白话&#xff1a;提高认知中长大 **************************** 基于认知心理学 战略的形成是认知构建的过程 最找连战略这个词都不一定知道 慢慢有些概念 慢慢形成整体的认知 战略认知派分两个分支 第一分支…

sql server删除历史数据

1 函数 datediff函数: DATEDIFF ( datepart , startdate , enddate )datepart的取值可以是year,quarter,Month,dayofyear,Day,Week,Hour,minute,second,millisecond startdate 是从 enddate 减去。如果 startdate 比 enddate 晚&#xff0c;返回负值。 2 例子 删除2023年以…

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置&#xff08;所有主机操作&#xff09; 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…

生成模型 -- GAN

文章目录 1. 生成模型与判别模型1.1 生成模型 2. VAE3. GAN3.1 GAN-生成对抗网络3.2 GAN-生成对抗网络的训练3.2.1 判别模型的训练&#xff1a;3.2.2 生成网络的训练&#xff1a; 4. LeakyReLU5. GAN代码实例 1. 生成模型与判别模型 生成模型与判别模型 我们前面几章主要介绍了…

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

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

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型&#x1f468;‍&#x1f3eb;前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…