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

news2024/11/16 4:29:48

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调用时只写了一个参数。

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

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

相关文章

基于opencv和tensorflow实现人脸识别项目源码+可执行文件,采用python中的tkinter库做可视化

项目名称: 基于OpenCv和tensorflow的人脸识别 完整代码下载地址&#xff1a;基于OpenCv和tensorflow的人脸识别 环境配置: Pythontensorflow2OpenCv categories: 人工智能 description: Opencv是一个开源的的跨平台计算机视觉库&#xff0c;内部实现了图像处理和计算机视觉方…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

pytorch serve开始-Getting started

官网链接 Getting started — PyTorch/Serve master documentation 安装TorchServe和torch-model-archiver 安装依赖 注意::对于Conda&#xff0c;运行Torchserve需要Python >3.8。 对于基于Debian的系统/ MacOS CPU python ./ts_scripts/install_dependencies.py 对…

C语言----文件操作(一)

一&#xff1a;C语言中文件的概念 对于文件想必大家都很熟悉&#xff0c;无论在windows上还是Linux中&#xff0c;我们用文件去存储资料&#xff0c;记录笔记&#xff0c;常见的如txt文件&#xff0c;word文档&#xff0c;log文件等。那么&#xff0c;在C语言中文件是什么样的存…

err_connect_length_mismatch错误

原因: 官网解释为&#xff1a;err_content_length_mismatch:错误的内容长度不匹配&#xff08;请求的Heather 里content-length长度与返回的content-length不一致&#xff09; 问题截图: 分析: 由截图可见,静态资源加载错误,提示err_content_length_mismatch,经排查,网络页签…

基于 Linux 内核驱动模块的简介

基于 Linux 内核驱动模块的简介 最简内核驱动原理 内核编程的最简单表现就是内核模块&#xff0c; 它可以作为一段可动态加载的成熟的内核级的代码使用。使用时一般不限制模块个数和类型&#xff0c;即插即用&#xff0c; 高效快捷、 性能稳定。缺点为性能和内存利用缺失&#…

计算机考研408-计算机网络、操作系统整书知识点脑图

计算机网络、操作系统整书知识点脑图 今天突然想起来考研期间为了方便记忆&#xff0c;费了很大力气整理了计算机网络、操作系统两本书知识点的脑图&#xff0c;想着放着也没啥用&#xff0c;分享出来给大家看看 但是思维导图格式的东西好像没法直接发成文章&#xff0c;上传…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句&#xff0c;但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件&#xff0c;loop body是循环体。 当循环条件成立时&#xff0c;…

【知识】如何区分图论中的点分割和边分割

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 以下两个概念在现有中文博客下非常容易混淆&#xff1a; edge-cut(边切割) vertex-partition(点分割)vertex-cut(点切割) edge-partition(边分割) 实际上&#xff0c;初看中文时&#xff0c;真的会搞不清楚。但…

滑动窗口练习(三)— 加油站问题

题目 测试链接 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组…

调新浪分享

前端写一个按钮,通过按钮来调出新浪界面, window.location.href http://service.weibo.com/share/share.php?url 这行代码调出新浪分享界面,要是想要添加一些图片和文字 使用: window.location.href http://service.weibo.com/share/share.php?url encodeURIComponent…

软件设计不是CRUD(7):低耦合模块设计实战——组织机构模块(中)

接上文《软件设计不是CRUD&#xff08;6&#xff09;&#xff1a;低耦合模块设计实战——组织机构模块&#xff08;上&#xff09;》 组织机构功能是应用系统中常见的业务功能之一&#xff0c;但是不同性质、不同行业背景、不同使用场景的应用系统对组织机构功能的要求可能完全…

[CTFshow 红包挑战] 刷题记录

文章目录 红包挑战7红包挑战8红包挑战9 红包挑战7 考点&#xff1a;xdebug拓展 源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…

visual studio code 好用的插件

vscode-icons Better comments 该插件对不同类型的注释会附加了不同的颜色&#xff0c;更加方便区分&#xff0c;帮助我们在代码中创建更人性化的注释。 Error Lens Error Lens插件是一款可以检测你编写的代码的语法错误&#xff0c;并且会显示出对语法错误的诊断信息…

中科院分区和JCR分区有什么区别

文章目录 名词解释学科划分不同参考的影响因子不同期刊分区不同期刊分区阈值不同 名词解释 中科院分区&#xff1a;又称“中科院JCR分区”&#xff0c;是中国科学院文献情报中心世界科学前沿分析中心的科学研究成果&#xff0c;期刊分区表数据每年底&#xff08;每年12月中下旬…

基于c++版数据结构基于数组栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

Java8流式编程详解

简介 java8提供的流式编程使得我们对于集合的处理不再是临时集合加上各种还能for循环&#xff0c;取而代之的是更加简洁高效的流水线操作&#xff0c;所以笔者就以这篇文章总结一下流式编程中常见的操作。 前置铺垫 后文示例操作中&#xff0c;我们都会基于这个菜肴类的集合…

BUUCTF crypto做题记录(3)新手向

目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文&#xff1a;U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码&#xff0c;上网搜索&#xff0c;在侧栏发现Rabbit解码&#xff0c;直接搜索就能有在线解码网站 二、篱笆…

【Vue第3章】使用Vue脚手架_Vue2

目录 3.1 初始化脚手架 3.1.1 说明 3.1.2 具体步骤 3.1.3 模板项目的结构 3.1.4 笔记与代码 3.1.4.1 笔记 3.1.4.2 01_src_分析脚手架 3.2 ref与props 3.2.1 ref 3.2.2 props 3.2.3 笔记与代码 3.2.3.1 笔记 3.2.3.2 02_src_ref属性 3.2.3.3 03_src_props配置 3…

【Linux】:线程(二)互斥

互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的&#xff0c;如果我们想要每个线程都单独访问g_val怎么办呢&#xff1f;其实我们可以在它前面加上__thread修饰。 这就相当于把g…