从零开始的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调用时只写了一个参数。

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

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

相关文章

LeetCode刷题--- 求根节点到叶节点数字之和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

在python中安装库,会有conda安装,也会有pip安装,conda与pip的区别是什么?

文章目录 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip与conda的区别&#xff1a;总结 一、Conda是什么&#xff1f; Conda是一个开源的包管理系统&#xff0c;它是Anaconda公司为Python和其他编程语言开发的。它主要用于数据科学和机器学习领域&#xff0c;…

【Vue】日常错误总结(持续更新)

日常遇到的小问题汇总, 内容小篇幅少的就全放这里了, 内容多的会在Vue专栏单独分享~ 目录 【Q】 el-form-item值为 null 或 undefined显示““ 【Q】dialog内组件数据刷新总是延迟慢一拍 问题背景描述 解决方案 代码简单模拟 JS 【Q】el-input 不能输入的解决办法 方法…

Orcal数据库Schema理解、表分区理解

目录 1 Schema1.1 Orcal数据库示例1.2 MySQL数据库示例 2 Orcal表分区2.1 创建表分区2.2 查看表分区2.3 查看指定分区数据 此前未了解过Schema的概念&#xff0c;仅知道Orcal数据库比较侧重这个概念&#xff0c;搜遍全网都&#xff0c;都是啰哩吧嗦的搬抄定义&#xff0c;特此在…

LeetCode算法题解(单调栈)|LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一个更大元素 II 题目链接&#xff1a;503. 下一个更大元素 II 题目描述&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的…

LIMoE:使用MoE学习多个模态

文章链接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 发表期刊&#xff08;会议&#xff09;: NeurIPS 2022 目录 1.背景介绍稀疏模型 2.内容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入门笔记 ——(3)理解pod对象

为什么需要pod 最为熟知的一句话&#xff1a;pod是k8s的最小调度单位。刚开始听到这句话时会想&#xff0c;已经有容器了&#xff0c;k8s为什么还要搞个pod出来&#xff1f;容器和pod是什么关系&#xff1f;容器的本质是进程&#xff0c;而k8s本质上类似操作系统。 熟悉Linux的…

SpringBoot系列之启动成功后执行业务的方法归纳

SpringBoot系列之启动成功后执行业务逻辑。在Springboot项目中经常会遇到需要在项目启动成功后&#xff0c;加一些业务逻辑的&#xff0c;比如缓存的预处理&#xff0c;配置参数的加载等等场景&#xff0c;下面给出一些常有的方法 实验环境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

欧拉回路欧拉路【详解】

1.引入 2.概念 3.解决方法 4.例题 5.回顾 1.引入 经典的七桥问题 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含两个岛屿及连接它们的七座桥&#xff0c;如下图所示。 可否走过这样的七座桥&#xff0c;而且每桥只走过一次&#xff1f; 你怎样证明&#xff1f;…

Linux上使用独立显卡Tesla T4(测试视频压缩)

背景 将视频处理程序单独部署至K8S之外&#xff0c;使用独立GPU显卡的一台服务器上。 需事先对GPU性能做简单测试。 已通过zabbix对Linux进行了系统资源监控。 已通过PrometheusGrafana对显卡Tesla T4做了性能监控。 逐步补充&#xff0c;稍等 2023年12月6日 操作 查看当前…

鸿蒙Harmony开发初探

一、背景 9月25日华为秋季全场景新品发布会&#xff0c;余承东宣布鸿蒙HarmonyOS NEXT蓄势待发&#xff0c;不再支持安卓应用。网易有道、同程旅行、美团、国航、阿里等公司先后宣布启动鸿蒙原生应用开发工作。 二、鸿蒙Next介绍 HarmonyOS是一款面向万物互联&#xff0c;全…

[Linux] 基于LAMP架构安装论坛

一、安装Discuz论坛 1.1 创建数据库&#xff0c;并进行授权 mysql -u root -p123CREATE DATABASE bbs; #创建一个数据库GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs数据库里面所有表的权限授予给bbsuser,并设置密码admin123flush privileges; #刷新数据库…

[渗透测试学习] Devvortex - HackTheBox

文章目录 信息搜集解题步骤提交flag 信息搜集 扫描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242发现80端口有http服务&#xff0c;并且是nginx服务 尝试访问web界面&#xff0c;发现跳转到http://devvortex.htb/无法访问 我们用vim添加该域名即可 sudo vim /etc/…

J.408之数据结构

J-408之数据结构_北京信息科技大学第十五届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 思维好题&#xff0c;直接用两个set存没出现的数字就好了 // Problem: 408之数据结构 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

【开源】基于Vue和SpringBoot的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…

Redis Bitmaps 数据结构模型位操作

Bitmaps 数据结构模型 Bitmap 本身不是一种数据结构&#xff0c;实际上它就是字符串&#xff0c;但是它可以对字符串的位进行操作。 比如 “abc” 对应的 ASCII 码分别是 97、98、99。对应的二进制分别是 01100010、01100010、01100011, 如下所示&#xff1a; a b …

HTML5+CSS3+JS小实例:文字依次点击验证

实例:文字依次点击验证 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件标志组

本节需要掌握以下内容&#xff1a; 1&#xff0c;事件标志组简介&#xff08;了解&#xff09; 2&#xff0c;事件标志组相关API函数介绍&#xff08;熟悉&#xff09; 3&#xff0c;事件标志组实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&am…

04_W5500_TCP_Server

上一节我们完成了TCP_Client实验&#xff0c;这节使用W5500作为服务端与TCP客户端进行通信。 目录 1.W5500服务端要做的&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a; 1.W5500服务端要做的&#xff1a; 服务端只需要打开socket&#xff0c;然后监听端口即可。 2…

HarmonyOS Developer——鸿蒙【构建第一个JS应用(FA模型)】

创建JS工程 JS工程目录结构 构建第一个页面 构建第二个页面 实现页面间的跳转 使用真机运行应用 说明 为确保运行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本为例&#xff0c;点击此处获取下载链接。 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击…