【C++】学习笔记——C++11_1

news2025/2/26 15:12:49

文章目录

  • 十九、C++11
    • 1. 统一的列表初始化
      • {}初始化
      • std::initializer_list
    • 2. 声明
      • auto
      • decltype
      • nullptr
    • 4. 范围for
    • 5. STL中的一些变化
      • 新容器
      • 新方法
    • 6. 右值引用和移动语句
      • 左值引用和右值引用
  • 未完待续


十九、C++11

1. 统一的列表初始化

{}初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。(注意:这里的初始化列表并不是构造函数里的初始化列表。)在C++11中,扩大了用大括号括起的初始化列表的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号 (=),也可不添加。

#include <iostream>
using namespace std;

struct Point
{
	int _x;
	int _y;
};

int main()
{
	// C++98 就支持的
	int array1[] = { 1, 2, 3, 4, 5 };
	int array2[5] = { 0 };
	Point p = { 1, 2 };

	// C++11 才支持的
	int x1 = 1;
	int x2{ 2 };
	int array1[]{ 1, 2, 3, 4, 5 };
	int array2[5]{ 0 };
	Point p{ 1, 2 };
	// C++11中列表初始化也可以适用于new表达式中
	int* pa = new int[4] { 0 };
	return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化:

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2022, 1, 1);

	// C++11支持的列表初始化,这里会调用构造函数初始化
	Date d2{ 2022, 1, 2 };
	Date d3 = { 2022, 1, 3 };
	return 0;
}

std::initializer_list

链接戳这里
大部分容器已经引进了 initializer_list ,使得容器也可以通过{}用来初始化。

#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

int main()
{
	vector<int> v = { 1,2,3,4 };
	list<int> lt = { 1,2 };
	// 这里{"sort", "排序"}会先初始化构造一个pair对象
	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
	// 使用大括号对容器赋值
	v = { 10, 20, 30 };

	return 0;
}

2. 声明

auto

c++11提供了多种简化声明的方式,尤其是在使用模板时。auto 的用法是自动类型推导。对于自定义类型,很容易出现类型名字特别长,不方便书写,就可以使用auto来自动推导类型名。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

int main()
{
	int i = 10;
	auto p = &i;
	auto pf = strcpy;
	cout << typeid(p).name() << endl << endl;
	cout << typeid(pf).name() << endl << endl;
	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
	map<string, string>::iterator it = dict.begin();
	auto ait = dict.begin();
	cout << typeid(dict).name() << endl << endl;
	cout << typeid(it).name() << endl << endl;
	cout << typeid(ait).name() << endl << endl;
	return 0;
}

在这里插入图片描述
auto不仅仅可以用作变量类型名,也可以用作函数返回值。

auto func()
{
	int ret;
	return ret;
}

decltype

关键字decltype将变量的类型声明为表达式指定的类型。一般在模板情况下,我们不知道接下来要定义的变量是什么类型,我们就可以借助这个关键字,他会推导类型,然后根据这个类型来定义变量。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>

using namespace std;

template<class T1, class T2>
void F(T1 t1, T2 t2)
{
	// 推导类型来定义变量
	decltype(t1 * t2) ret;
	cout << typeid(ret).name() << endl;
}

int main()
{
	const int x = 1;
	double y = 2.2;
	// 推导类型
	decltype(x * y) ret;
	decltype(&x) p;
	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;
	F(1, 'a');
	return 0;
}

在这里插入图片描述

nullptr

这个我们已经比较熟悉了。由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。

4. 范围for

这个我们也很熟悉了,借助的是迭代器。只有有迭代器的容器才能使用。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v{ 1,2,3,4,5,6,7,8,9 };
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

5. STL中的一些变化

查文档戳这里

新容器

在这里插入图片描述
其中 unordered_setunordered_map 我们已经见过了,就是哈希表,array 则是静态数组,长度是已经固定的数组。forward_list 就是单链表。

新方法

基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。还有其他新方法这里建议去看文档。

6. 右值引用和移动语句

左值引用和右值引用

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做 左值引用无论左值引用还是右值引用,都是给对象取别名。
那什么是左值,什么是右值?左值就是我们可以获取它的地址,并且它一般情况下是可以被赋值的就是左值。右值就是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值等等。
并不是在左边就是左值,右边就是右值。在引用时,左值和右值都在右边。
左值引用就是给左值的引用,给左值取别名。
右值引用就是对右值的引用,给右值取别名。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

int main()
{
	// 以下的p、b、c、*p都是左值
	int* p = new int(0);
	int b = 1;
	const int c = 2;
	// 以下几个是对上面左值的左值引用
	int*& rp = p;
	int& rb = b;
	const int& rc = c;
	int& pvalue = *p;


	double x = 1.1, y = 2.2;
	// 以下几个都是常见的右值
	// 字面常量
	10;
	// 表达式
	x + y;
	// 返回值
	fmin(x, y);
	// 以下几个都是对右值的右值引用
	int&& rr1 = 10;
	double&& rr2 = x + y;
	double&& rr3 = fmin(x, y);
	return 0;
}

语法上:引用都是别名,不开空间,左值引用就是给左值取别名,右值引用就是给右值取别名。
底层上:引用都是指针实现的,左值引用存的是当前左值的地址。右值引用是把当前右值拷贝到栈上的一个临时空间,指向这个临时空间的地址。

左值引用只能引用左值,不能引用右值,但是const左值引用既可引用左值,也可引用右值。
右值引用只能右值,不能引用左值。但是右值引用可以move以后的左值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

int main()
{
	// 右值引用只能右值,不能引用左值。
	int&& r1 = 10;
	int a = 10;
	// 这里会报错
	int&& r2 = a;

	// 但这里会成功,右值引用可以引用move以后的左值
	int&& r3 = move(a);
	return 0;
}

未完待续

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

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

相关文章

C++ map/set 函数用法解析

一 . set 1.1 set 是什么、关联/非关联式容器 se是一种关联式容器&#xff0c;主要用进行查找的工作。采用了key模型&#xff0c;判断数据在不在。不支持修改的操作。 序列式容器&#xff08;线性表&#xff09;&#xff1a;vector / list /deque&#xff08;单纯存储数据&am…

top命令从入门到精通

top命令从入门到精通 linux平台上一个可以用于性能监控、排查的神器。 响应参数 up&#xff1a;运行时长users&#xff1a;当前登陆了几个用户load average&#xff1a;运行负载 sleeping&#xff1a;休眠进程stopped&#xff1a;终止进程zombie&#xff1a;僵尸进程 us&…

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#xff0c;没有和其它前端框架…

【C++BFS】959. 由斜杠划分区域

本文涉及知识点 CBFS算法 LeetCode959. 由斜杠划分区域 在由 1 x 1 方格组成的 n x n 网格 grid 中&#xff0c;每个 1 x 1 方块由 ‘/’、‘’ 或空格构成。这些字符会将方块划分为一些共边的区域。 给定网格 grid 表示为一个字符串数组&#xff0c;返回 区域的数量 。 请注…

整理压缩JavaScript文件

你是不是会担心有专业人员通过你写的JavaScript语法来判断你的接口数据&#xff0c;今天就介绍一种可以封装你写的JavaScript的工具 环境&#xff1a;Windows10、node20.11.1、Vue/cli 5.0.8 uglify-js 是一个流行的 JavaScript 压缩工具&#xff0c;用于减少 JavaScript 文件…

angular入门基础教程(二)第一个angular组件

ng中的语法跟vue中是一样的插值语法&#xff0c;其实也是早期vue抄的ng的思路&#xff0c;使用{{variable}}形式&#xff0c;vue借鉴了ng和react&#xff0c;这个我们就不多了。 新建一个子组件 在项目根目录下面&#xff0c;执行 ng g component ./components/UserList这样…

Transformer——逐步详解架构和完整代码搭建

好久没更新博客&#xff0c;后面更新会勤一些。今天想聊一下Transformer&#xff0c;Transformer在NLP和CV领域都有着重要的价值&#xff0c;甚至可以看作是一个基础模型&#xff0c;这篇博客将通过详细代码深入解析Transformer模型总体架构图各个部分的的作用和搭建:论文链接&…

angular入门基础教程(九)依赖注入(DI)

依赖注入 Angular 中的依赖注入&#xff08;DI&#xff09;是框架最强大的特性之一。可以将依赖注入视为 Angular 在运行时为你的应用 提供所需资源的能力。依赖项可以是服务或其他资源。 使用服务的一种方式是作为与数据和 API 交互的方式。为了使服务可重用&#xff0c;应该…

晋升有望,5本易录用的计算机三四区潜力刊,通过率>50%,2个月超速接收,好发

今天模术狮给大家整理了5本让你晋升有望&#xff01;易录用的计算机三区四区潜力刊&#xff0c;通过率&#xff1e;50%&#xff0c;2个月超速接收&#xff0c;好发&#xff01; 1 DATA MINING AND KNOWLEDGE DISCOVERY 期刊简介&#xff1a;数据收集、存储和分发方面的进步产生…

Qt系统机制

Qt系统 Qt文件概述输入输出设备类QFileQFileInfoQt多线程Qt多线程常用API使用Qt多线程 线程安全互斥锁读写锁条件变量信号量 Qt网络QUdpSocketQNetworkDatagram设计一个UDP回显服务器QTcpServerQTcpSocketTcp版本的回显服务器HttpClient核心API Qt 音频Qt视频 Qt文件概述 ⽂件操…

阿里云服务器系统盘扩容后,宝塔面板不显示新容量的问题

1. 安装 growpart 扩展 yum install -y cloud-utils-growpart 2. 运行fdisk -l命令查看磁盘实际大小。 fdisk -l 用于:查看磁盘实际大小 说明:磁盘(/dev/vda)实际大小为:250 G。 3. 运行df -h命令查看磁盘分配大小。 df -h 用于:查看磁盘分配大小 4. 自适应分区扩容 g…

2024 Navicat Premium最新版简体中文版破解激活永久图文详细教程(亲测可用)

1.官网下载&#xff1a;下载地址 2.百度网盘下载&#xff1a;下载地址 3.未安装过的用户可直接跳过该步骤&#xff0c;如果已安装Navicat&#xff0c;记得先卸载干净&#xff0c;防止破解失效&#xff0c;卸载完成后执行补丁压缩包中的Navicat.bat脚本&#xff08;一闪而过表示…

热门景区精准客流统计也能如此简单做到了

在热门景区&#xff0c;游客如织&#xff0c;如何实现精准的客流统计成为了景区管理者关注的重点。令人欣喜的是&#xff0c;如今这一难题已经有了简单而有效的解决方案。 一、景区应用客流统计的原因 首先&#xff0c;热门景区承载着巨大的游客流量&#xff0c;为了确保游客的…

如何使用git拉取gitee上面的项目/代码?(超简单)

一、下载git软件 下载地址&#xff1a;git官网地址 1.点击右边小电脑上的按钮下载 2.选择自己电脑对应的系统 3.基本都是默认&#xff0c;这里需要勾一下就ok 4.正在安装 2.使用git软件 1.如何打开git 找到你想要操作的文件夹&#xff0c;右击open git bash here就可以…

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器&#xff08;web server&#xff09; 也称HTTP服务器&#xff08;HTTP server&#xff09;&#xff0c;主要有 Nginx、Apache、Tomcat 等。…

【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!

我们诚挚地邀请您参与第四届区块链技术与信息安全国际会议&#xff08;ICBCTIS 2024&#xff09;。本届会议将于2024年8月17日~19日在中国武汉召开。会议将围绕区块链技术与信息安全等相关研究领域&#xff0c;特邀国内外数位在此领域学术卓越的学者专家做相关致辞与报告&#…

一行Python代码实现神奇效果:创意编程实例

文末赠免费精品编程资料~~ 1. 基础中的魔法&#xff1a;打印艺术 目标&#xff1a;用一行代码打印出一个简单的图案&#xff0c;比如心形。 print( .join([**i for i in range(1, 6)] [ *4] [**i for i in range(5, 0, -1)]))解析&#xff1a; 我们利用列表推导式生成两部…

Halcon深度学习分类模型

1.Halcon20之后深度学习支持CPU训练模型&#xff0c;没有money买显卡的小伙伴有福了。但是缺点也很明显&#xff0c;就是训练速度超级慢&#xff0c;推理效果也没有GPU好&#xff0c;不过学习用足够。 2.分类模型是Halcon深度学习最简单的模型&#xff0c;可以用在物品分类&…

说真的,内裤袜子丢进洗衣机比手洗好!内裤袜子洗衣机推荐

内裤和袜子作为日常生活中不可或缺的贴身衣物&#xff0c;其清洁卫生尤为重要&#xff0c;但频繁的洗涤工作往往令人感到繁琐。正是因为这一清洗需求&#xff0c;内裤袜子洗衣机应运而生&#xff0c;它不仅为我们的生活带来了便利&#xff0c;更体现了对个人卫生和生活品质的重…