C++11语法杂记(更新中)

news2025/1/13 15:36:30

在这里插入图片描述

文章目录

  • 一. delctype
  • 二. default
  • 三. delete
  • 四. 可变参数模板
  • 五. emplace系列
  • 六. noexcept
  • 七. constexpr

一. delctype

delctype和auto类似,也可以自动识别类型
举例如下:
在这里插入图片描述

与auto不同的是,auto只能用于定义变量类型,而decltype返回的是类型,可以应用到模板

在这里插入图片描述

二. default

C++11可以让我们更好的控制是否生成默认成员函数。如果我们需要某个默认的成员函数,但是因为一些原因,该函数没有默认生成,那么我就可以使用default关键字强制其生成。
比如:我们提供了析构函数,拷贝构造,拷贝赋值重载的任意一个,那么编译器就不会帮我们生成默认的移动构造。此时我们可以使用default关键字,显示指定其生成。

假设我们现在有一个Person类。
我们强制其生成移动构造

Person(Person&&p)=default;

三. delete

C++11也提供我们限制某些默认函数的生成。
在C++98中,是将该函数设置成private。但在C++11中,提供了delete关键字,只需要在该函数声明后加上=delete,编译器就不会生成其默认函数,称=delete修饰的函数为删除函数。
一般一个类不允许修改,就可以使用=delete

STL中就有这样的应用
在这里插入图片描述

同样还是Person类,假如我们不想生成默认拷贝构造

Person(const Person&p)=delete;

四. 可变参数模板

在C语言中,我们有使用过可变参数

在这里插入图片描述
即,我们可以传递多个参数,编译器会自动帮我们识别。

在C++98/03中,类模板和函数模板只能固定数量的模板参数,而在C++11中,可变参数模板可以让我们任意传递数据类型。

基本的可变参数模板时这样的

//Args是一个模板参数包,args是一个函数形参参数包
//声明一个参数包Ags...args,这个参数熬中可以包含0到任意个模板参数
template<class ...Args>
void showList(Args... args)
{
	//我们可以使用sizeof查看当前可变参数包有几个参数
	cout << sizeof...(args) << endl;
}

int main()
{
	showList('x');
	showList('x', 6);
	showList('x', 6, 3.0);
}

运行结果如下:

在这里插入图片描述

而我们要想解析可变参数包,有以下两种方法:

第一种方法

使用一个模板参数,递归逐个接收可变参数包的参数。

代码如下:

void showList()
{
	cout << endl;
}

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

int main()
{
	showList('x');
	showList('x', 6);
	showList('x', 6, string("hello world"));
}

我们通过第一个模板参数,将可变参数包的参数逐个取出,知道可变参数包参数个数为0时,会调用最上面的showList,打印换行,并且其作为递归终止的条件

在这里插入图片描述

同时我们还可以获取其参数类型

在这里插入图片描述

可变参数包类型的推导是在编译的时候进行的,和函数模板的实例化一样。

第二种方法

template<class T>
int Print(const T&val)
{
	cout << val << " ";

	return 0;
}

template<class ...Args>
void printList(Args... args)
{
	int arr[] = { Print(args)... };
	cout << endl;
}

int main()
{
	printList('x');
	printList('x', 6);
	printList('x', 6, string("hello world"));
}

在printList中,我们用Print(args)…的返回值初始化arr数组,编译时,需要知道arr数组有多大,所以会解析Print,然后Print每次接收可变参数包的一个参数,有几个参数,就会解析几次。

在这里插入图片描述

而可变参数包在STL中也有使用

在这里插入图片描述
线程的构造函数,就有使用可变参数包,因为传参可能发送拷贝。所以这里使用万能引用,左值,右值都可以接收。

在这里插入图片描述

emplace系列也使用万能引用的可变参数包

五. emplace系列

在STL中,所有的容器都增加了emplace的插入
在这里插入图片描述

接下来我们就来分析一下emplace系列和push系列的差别

在这里插入图片描述

在这里插入图片描述

可以看到,emplace_back使用了可变参数包,push_back有左值引用和右值引用的版本。

简单实现一个string,在其构造,拷贝构造和移动构造部分打印内容,方便展示效果

在这里插入图片描述

首先,我们看到,push_back和emplace_back对于深拷贝的左值和右值效率是一样的。
因为在push_back和emplace_back在类模板中都实例化的是string。

我们再看以下场景

在这里插入图片描述

如果是直接用字符串构造,那么push_back会先调用string的单参构造,构造一个临时对象,然后再移动拷贝
而emplace_back因为是可变参数包,所以推演出的是const char*,这样就会直接去调用单参构造。但是对于深拷贝的类,push_back和emplace_back的效率差别不大,因为push_back就多一个移动拷贝,代价很低。

但是看到这里,相信大家也明白效率差异会出现在浅拷贝的类,如果浅拷贝的类,成员很多,那么按字节拷贝的代价还是很高的。push_back在面对这样传值构造,而不是传类对象构造,需要一次单参数构造,和一次按字节拷贝。而emplace_back只需要单参数构造即可。emplace因为使用可变参数包,所以,只要类有有参构造,那么可变参数包就可以匹配,从而直接构造

总体来说,emplace比push高效在复杂的浅拷贝类。深拷贝相差不大,但push_back的使用场景,emplace_back也可以使用,所以无脑使用emplace是可以的

六. noexcept

七. constexpr

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

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

相关文章

查看ResultSet中的rowData

之前的dml语句都返回值都是int表示有改动的行数 那么Select可是要展示数据的 SELECT查询的结果 通过这个ResultSet遍历 然后通过next方法来一行行读取数据 类似于迭代器(肯定不是迭代器) 里面还包含获得的数据元素 相当于这个既包含元素&#xff0c;还能迭代自己的元素 具体你…

MySQL——DQL,DCL语言学习

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 前言 本章将会讲解MySQLDQL&#xff0c;DCL语言的学习。 一.DQL DQL 英文全称是 Data …

全志V3S嵌入式驱动开发(五种镜像烧入的方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于v3s的镜像烧入&#xff0c;大约有五种方法。前面陆陆续续已经介绍了三种方法&#xff0c;实际工作中具体使用哪一种&#xff0c;大家可以根据自…

SpringBoot 监控与管理的主要组件

SpringBoot 监控与管理的主要组件 SpringBoot作为一款开箱即用的Java Web开发框架&#xff0c;集成了很多方便开发者使用的组件。其中一个非常重要的组件就是监控与管理组件。在现代的分布式应用中&#xff0c;监控与管理已经成为了必不可少的一部分。SpringBoot提供了一些非常…

指针与数组--动态数组(1)[1、C程序的内存映像 2、动态内存分配]

目录 一、C程序的内存映像 二、动态内存分配 1、malloc&#xff08;&#xff09;函数 2、calloc&#xff08;&#xff09;函数 3、free&#xff08;&#xff09;函数 4、realloc&#xff08;&#xff09;函数 一、C程序的内存映像 一个编译后的C程序 获得并使用4块在逻辑上不…

vue+leaflet 使用js自定义封装动画marker样式点

效果图 1. 引入leaflet import L from leaflet2. 使用原生js实现 import L from leaflet; import ../assets/css/blinkmarker.css; L.blinkMarker (point, property) > {// 使用js标签,便于操作,这个temDivEle的作用是将divEle通过innerHTML的方式获取为字符串var temp…

Nacos 打通 CMDB 实现就近访问

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

小程序 体验版 快速配置https服务接口 - 项目是nodeJS配置本地https服务,不用下载源码不用付费,直接使用Git的openssh功能(亲测有效)

背景 学习网易云音乐小程序开发&#xff0c;用了老师的node JS做后端服务器&#xff0c;上线小程序体验版必须要https接口。 接下来就是配置NodeJs服务https踩的坑跟发现的惊喜。 配置https 下载与配置 密钥生成 1 运行命令 &#xff1a; openssl genrsa -out privatekey.p…

BST有缺陷--红黑树(RBT)应运而生

1.首先介绍一下什么是BST&#xff08;二叉查找树&#xff09; 若其左子树非空&#xff0c;则左子树上所有节点的值都小于根节点的值若其右子树非空&#xff0c;则右子树上所有节点的值都大于根节点的值其左右子树都是一棵二叉查找树二叉排序树通过中序遍历可以得到递增序列 如下…

技能树-网络爬虫-selenium

文章目录 前言一、selenium二、selenium 测试用例总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下《技能树-网络爬虫-selenium》。 一、selenium Selenium是web自动化测试工具集&#xff0c;爬虫可以利用其实现对页面动态资源的采集&#xff0c;对于…

一位老程序员的忠告:别想着靠技术生存一辈子

注&#xff1a;本文系转载。 笔者目前是自己单干&#xff0c;但此前有多年在从事软件开发工作&#xff0c;回头想想自己&#xff0c;特别想对那些初学JAVA/DOT、NET技术的朋友说点心里话&#xff0c;希望我们的体会多少能给你们一些启发。 一、 在一个地方工作8小时就是“穷”…

Python多线程与多进程教程:全面解析、代码案例与优化技巧

文章目录 引言多线程多线程概述案例1&#xff1a;使用多线程实现并发下载文件案例2&#xff1a;使用多线程处理CPU密集型任务 使用threading模块案例1&#xff1a;自定义线程类并启动线程案例2&#xff1a;使用锁保护共享资源 线程同步与互斥案例&#xff1a;使用锁实现线程安全…

css用法总结

1. 块级元素合并时边框重叠问题的解决方案 设置边框2px 红色 如果不做处理&#xff0c;仅仅添加边框则会是这个样子 设置处理后的样式 代码展示 2. 拥有边框的div , hover时的展示效果 代码展示 3. img 和 文字环绕展示 代码展示 设置左浮动即可 4. text-align: center; 可…

Linux——Samba文件共享服务

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…

Go语言基础-基础语法

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 &#x1f49e;从这个专栏里面可以迅速获得Go的知识 本文主要是根据今天所学&#xff08;链接放在了最后&#xff09;总结记录的…

please specify ‘programme‘ in launch.json

故障现象&#xff1a; 在windows下点击F5&#xff0c;以运行vscode代码&#xff0c;在屏幕右下角出现这个错误提醒&#xff1b; 故障原因&#xff1a; 在配置文件&#xff08;settings.json或者launch.json&#xff09;中&#xff0c;缺少“program”这个参数配置&#xff1b…

SpringBoot 如何使用 Actuator 进行应用程序监控

SpringBoot 如何使用 Actuator 进行应用程序监控 在现代的应用程序开发中&#xff0c;应用程序监控是非常重要的&#xff0c;因为它可以帮助我们快速发现和解决问题。Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助我们监控和管理…

0003Java程序设计-SSM+JSP现代家庭教育网站

摘 要 本毕业设计的内容是设计并且实现一个基于java技术的现代家庭教育网站。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;java技术和Tomcat网络信息服务作为应用服务器。现代家庭教育网站的功能已基本实现&#xff0c;主要包括主页、个人中心、会员管理、…

Maven如何创建Maven web项目

1、创建一个新的模块: 1.1 使用骨架点一下&#xff0c;这里 1.2 找到maven-archetype-webapp项目&#xff0c;选中点击&#xff0c;一路next就行。 1.3 删除不必要的maven配置&#xff1a;&#xff08;这里我不需要&#xff0c;针对自己情况而定&#xff09; 可以从name这里开…

figma设计软件专业版教育优惠学生使用edu邮箱免费教程

产品介绍 今天一个买家发了一个链接问是否可以用&#xff0c;本站也是第一次见到&#xff0c;就测试了下可以使用教育优惠后准备分享给大家。本站的大多数教育优惠线报其实都是很多网友买家提供的。 Figma是一款用于数字项目的基于云的设计和原型的设计工具软件。 这样做的目…