从零开始的C++(二十一)

C++11

1.列表初始化:

//允许以下代码正确运行

int a[]{1,2,3};//效果与int a[]={1,2,3}一致

即允许省略等于号。同时,允许用花括号对所有自定义类型和内置类型进行初始化,而非以前花括号只能对数组进行初始化。利用花括号对自定义类型初始化时,相当于调用了其构造函数。

2.std::initializer_list

一般用作构造函数的参数,接受一系列的初始值,并以此赋给每个对象。

因此,允许以下操作:


map<int,string>v={{1,"one"},{2,"two"}};
//其中{1,"one"}和{2,"two"}均对应一个pair<int,string>的对象,用于给map赋值。

3.decltype

可以获得变量的类型,并且可以用这个类型构造变量(与typeid不同,typeid只能得到类型,不能用来定义变量)

4.右值引用

左值:可以取地址的表达式,因为可以取地址因此可以给其赋值,所以可以出现"="的左右任意一侧。对左值进行引用,就是给其取个别名,称为左值引用。

右值:不可以取地址的表达式,无法给其赋值,因此只能出现在"="右侧,对右值进行引用,称为右值引用。常见的右值有表达式返回值、常量、函数返回值(返回非左值引用的类型才行)。

需注意,右值不能取地址,无法给其赋值,但是,右值引用后会有一份地址保存这个值,就可以通过这个地址对其进行修改。若不希望被修改,就用const修饰右值引用。

左值引用与右值引用区别:

左值引用:正常只能引用左值,用const修饰可以引用左值和右值

右值引用:正常只能引用右值,但是给左值加move可以被右值引用

int i=1;
int &&a=move(i);  //此处i是左值,但move(i)返回的是右值

右值引用应用:

常用于函数返回临时对象时,此时无法返回左值引用,因为变量是出了函数作用域就销毁的。若不用右值引用,则正常需要进行两次深拷贝(编译器可能优化成一次),但右值引用可以不进行深拷贝,极大提高了效率。

而右值引用的原理是,认为临时对象出了作用域就要被销毁,因此可以直接拿过来临时对象的成员,这样就不用进行深拷贝了。这就是移动构造的思想。

同时,也有移动赋值,函数参数是右值引用,原理也是直接交换对象的成员,而非深拷贝。

5.完美转发:

用于有万能模版的情况下。而万能模版就是一种特殊的模版函数,其成员是T&&val,此时可以接受左值引用也可以接受右值引用,因此是万能模版。而无论是左值引用还是右值引用,其类型都是左值(注:是右值引用是左值,不是右值是左值!),因此,若用右值引用做参数,只能调用以左值引用为形参的函数,无法调用以右值为形参的函数,若想要调用只能用move,但这样就只能调用右值引用为参数的。为了实现左值引用可以调用左值为参数的函数,右值引用可以调用右值为参数的函数,在引用前加一个forward,效果是右值引用则返回一个右值,左值引用就返回一个左值。

6.默认成员函数的增加:

增加了默认移动构造和默认移动赋值构造,编译器自己写默认移动构造函数的前提是:

1.用户自己未编写移动构造

2.用户为编写拷贝构造、赋值构造和析构函数。

使用:对于内置类型进行逐字节拷贝,对于自定义类型若有移动构造调用移动构造,若没有调用拷贝构造。

(对于默认移动赋值前提和使用极其类型,就是把移动构造改成移动赋值即可)

7.强制生成/销毁默认成员函数:

强制生成:default;    强制销毁:delete    一般称=delete的函数是删除函数

class bb
{
   public:
   
   bb()=default;//强制生成
   
   bb(const bb&b)=delete;//强制删除

}

8.可变参数模版:

写法:

template<class...Args>

返回类型 函数名(Args...args)

//函数体

}

args前面有...,是可变模版参数。称前面有...的参数为参数包,参数包里包含0到N个可变模版参数。

如何获取参数包里的可变模版参数:

1.用递归展开:

void _get()
{
	cout<< endl;
}

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

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

int main()
{
	get(1, 2.2, "xxx");
}

原理就是不断用T获取最左的那个可变模版参数,然后不断缩小参数包内的可变模版参数的个数,最后当可变模版参数为0时调用打印空格,实现获取所有的参数。

2.利用逗号表达式:

template<class T>
void print(T& val)
{
	cout<< val << " ";
}

template<class...Args>
void get(Args...args)
{
	//_get(args...);

	int a[] = { (print(args),0)... };
	cout << endl;
}

原理是利用初始化列表展开成(print(args1),0)、(print(args2),0)...,同时利用逗号表达式依次去执行每个()内的两条表达式,实现获取每个参数。

9.lambda表达式

形式:

[]+()+mutable+->+{};

其中:

[]:捕捉列表,包含在于lamabda相同作用域内的变量.[var]表示捕获变量var。[=]表示捕获父作用域内所有变量。[&var]表示捕获var变量的引用。[&=]表示父作用域所有变量的引用。[this]表示捕获当前的this指针。[]内可以包含多钟类型的捕捉,比如[&var1,var2,this],但注意相同变量不能重复捕获。

():函数参数列表,若无参数可以省略

mutable:若无mutable则表示该lambda函数是const修饰的函数,若有则可以取消常量性。注:若加上mutable,则参数列表无论有无参数都得写"()"。

->:指向返回类型,若返回类型是空可以省略,若返回类型十分明确也可以省略让编译器自动推导。

{}:函数体部分。

ps:只有[]和{}部分一定不能省略

lambda的底层代码是仿函数,若想要用一个变量接受该表达式,则需要用auto修饰变量,因为lambda返回的类型由编译器自己决定,无法显示知道并调用。

10.包装器:

头文件是<functional>

function<返回类型(函数参数)>对象={}。

作用:可以让对象赋值为仿函数、函数形参、lambda函数(但返回类型和函数参数必须相同)

(注:当接受的是lambda函数时,不管[],只要()和返回类型一致就行)

11.bind:

类型一个函数模版。功能是接受一个可调用对象,返回一个新的可调用对象去适应原本的函数参数,如修改函数参数的先后顺序和个数。

使用:

auto newcallable=bind(callable,arg_list),其中newcallable是新生成的可调用对象,callable是原可调用对象,arg_list是一个逗号表达式,包含callable的参数。

arg_list:可以是placeholder::_x,表示当前位置对应函数第x个参数。

如上图,newf中1对应的是placeholder::_2,故对应lambda的第二个函数参数b。

arg_list也可以是一个固定变量或常量,表示该位置是一个固定的函数参数,一般用于某个调用的参数固定不变的情况。

如上图,第一个参数a对应的位置为常量111,此时调用时就不需要在显示写该参数了,因此newf调用时只写了一个参数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构和算法-单链表

数据结构和算法-单链表 1. 链表介绍 链表是有序的列表&#xff0c;但是它在内存中是存储如下 图1 单链表示意图 小结: 链表是以节点的方式存储每个节点包含data域&#xff0c;next域&#xff0c;指向下一个节点。如图&#xff1a;发现链表的各个节点不一定是连续存储。比如地…

C语言函数详解

# 函数的概念 对于函数&#xff0c;我想大家应该并不陌生&#xff0c;在数学中就存在函数的概念&#xff0c;比如&#xff1a;一次函数 ykxb &#xff0c;k和b都是常数&#xff0c;给⼀个任意的x&#xff0c;就能得到⼀个y值。 在C语言中也有函数的概念&#xff0c;函数也被称为…

unity 模型生成PNG图片并导出(可以任意控制方向和大小,本文提供三种方案)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、插件RuntimePreviewGenerator&#xff08;方案一&#xff09;二、unity 官方提供的接口&#xff08;方案二&#xff09;三、方法三&#xff0c;可以处理单个模型&#xff0c;也…

STM32基于USB串口通信应用开发

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

git自动更新功能

确认权限 因为一般Linux系统网页用的www 或 www-data用户和用户组,所以要实现自动来去,首先要在www用户权限下生成ssh密钥,不然没有权限,其次就是,要把用root用户拉去的代码,批量改成www用户 1. 给www权限 vi /etc/sudoers www ALL=(ALL) NOPASSWD:/bin/chow…

整体式雨水收集pp模块可根据需求承重可达30到60吨每平方米

整体式雨水收集pp模块的承重能力主要取决于其设计和制造工艺&#xff0c;以及所使用的材料。一般来说&#xff0c;模块的尺寸越大&#xff0c;承重能力也越大。同时&#xff0c;模块的设计和制造工艺也会影响其承重能力。 在设计和制造整体式雨水收集pp模块时&#xff0c;需要…

unity 2d 入门 飞翔小鸟 小鸟碰撞 及死亡(九)

1、给地面&#xff0c;柱体这种添加2d盒装碰撞器&#xff0c;小鸟移动碰到就不会动了 2、修改小鸟的脚本&#xff08;脚本命名不规范&#xff0c;不要在意&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : Mo…

CompletableFuture异步多任务最佳实践

简介 CompletableFuture相比于Java8的并行流&#xff0c;对于处理并发的IO密集型任务有着得天独厚的优势&#xff1a; 在流式编程下&#xff0c;支持构建任务流时即可执行任务。CompletableFuture任务支持提交到自定义线程池&#xff0c;调优方便。 本文所有案例都会基于这样…

向日葵远程控制鼠标异常的问题

​ 在通过向日葵进行远程控制的时候&#xff0c;可能会遇到鼠标位置异常的问题。此时&#xff0c;不管怎么移动鼠标&#xff0c;都会停留在屏幕最上方&#xff0c;而无法点击到正确的位置。如图&#xff1a; 此时&#xff0c;如果启用了“被控端鼠标”功能&#xff0c;可以正…

ChatGLM3-6B和langchain阿里云部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ChatGLM3-6B部署搭建环境部署GLM3 二、Chatglm2-6blangchain部署三、Tips四、总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; …

回顾2023 亚马逊云科技 re_Invent,创新AI,一路同行

作为全球云计算龙头企业的亚马逊云科技于2023年11月27日至12月1日在美国拉斯维加斯举办了2023 亚马逊云科技 re:Invent&#xff0c;从2012年开始举办的亚马逊云科技 re:Invent 全球大会,到现如今2023 亚马逊云科技 re:Invent&#xff0c;回顾历届re:Invent大会&#xff0c;亚马…

imutils库介绍及安装学习

目录 本机环境 安装 函数及属性 列举imutils库信息 属性和函数介绍及使用 属性 常用函数 方法使用 图像平移 图像缩放 图像旋转 骨架提取 通道转换 OPenCV版本的检测 综合测试 介绍 imutils 是一个用于图像处理和计算机视觉任务的 Python 工具包。它提供了一系…

Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地

前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…

centos7中的计划任务

一次调度执行-----at 安装&#xff1a; [rootzaotounan ~]# yum -y install at ​ 启动&#xff1a; [rootzaotounan ~]# systemctl start atd ​ 开机自启动&#xff1a; [rootzaotounan ~]# systemctl enbale atd ​ 语法&#xff1a; at <时间规格> 时间规格参数&…

Linux下C++动态链接库的生成以及使用

目录 一.前言二.生成动态链接库三.使用动态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C动态链接库&#xff08;.so文件&#xff09;。 二.生成动态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&…

键盘打字盲打练习系列之矫正坐姿——4

一.欢迎来到我的酒馆 盲打&#xff0c;矫正坐姿&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿1.键盘与鼠标2.椅子 三.改善坐姿建议 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&#xff0c;相信大…

C语言数据结构-双向链表

文章目录 1 双向链表的结构2 双向链表的实现2.1 定义双向链表的数据结构2.2 打印链表2.3 初始化链表2.4 销毁链表2.5 尾插,头插2.6 尾删,头删2.7 根据头次出现数据找下标2.8 定点前插入2.9 删除pos位置2.10 定点后插入 3 完整代码3.1 List.h3.2 Lish.c3.3 test.c 1 双向链表的结…

redis中缓存雪崩,缓存穿透,缓存击穿等

缓存雪崩 由于原有缓存失效&#xff08;或者数据未加载到缓存中&#xff09;&#xff0c;新缓存未到期间&#xff08;缓存正常从Redis中获取&#xff0c;如下图&#xff09;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成巨大压力&#xff0c…

数据结构算法-希尔排序算法

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

C++ 学习系列 -- 实现简单的 String

1 标准库 std::string c 中的 std::string 是一个重要的字符串的类, 我们在日常工作中常常与之打交道。 string是C标准库的重要部分&#xff0c;主要用于字符串处理。使用string库需要在同文件中包括该库 #include<string> std::string 实际上是 std::basic_string<…