【C++航海王:追寻罗杰的编程之路】C++11(上)

目录

1 -> C++11简介

2 -> 统一的列表初始化

2.1 -> {}初始化

2.2 -> std::initializer_list

3 -> 声明

3.1 -> auto

3.2 -> decltype

3.3 -> nullptr


1 -> C++11简介

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了
C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞
进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于
C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中
约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,
C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更
强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。

2 -> 统一的列表初始化

2.1 -> {}初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

struct fyd
{
	int x;
	int y;
};

int main()
{
	int array1[] = { 1, 2, 3, 4, 5 };
	int array2[5] = { 0 };
	fyd p = { 1, 2 };

	return 0;
}

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自
定义的类型,使用初始化列表时,可添加等号(=),也可不添加。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

struct fyd
{
	int x;
	int y;
};

int main()
{
	int x1 = 1;
	int x2{ 2 };
	int array1[]{ 1, 2, 3, 4, 5 };
	int array2[5]{ 0 };
	fyd p{ 1, 2 };

	// C++11中列表初始化也可以适用于new表达式中
	int* pa = new int[4]{ 0 };

	return 0;
}

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

#define  _CRT_SECURE_NO_WARNINGS 1

#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(2024, 4, 1);

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

	return 0;
}

2.2 -> std::initializer_list

std::initializer_list的介绍文档

std::initializer_list是什么类型:

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

int main()
{
	auto il = { 10, 20, 30 };

	cout << typeid(il).name() << endl;

	return 0;
}

std::initializer_list使用场景:

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=
的参数,这样就可以用大括号赋值。

list

vector

map

operator=

#define  _CRT_SECURE_NO_WARNINGS 1

#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;
}

让模拟实现的vector也支持{}初始化和赋值

#define  _CRT_SECURE_NO_WARNINGS 1

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

namespace fyd
{
	template<class T>
	class vector 
	{
	public:
		typedef T* iterator;
		vector(initializer_list<T> l)
		{
			_start = new T[l.size()];
			_finish = _start + l.size();
			_endofstorage = _start + l.size();
			iterator vit = _start;

			typename initializer_list<T>::iterator lit = l.begin();
			while (lit != l.end())
			{
				*vit++ = *lit++;
			}
			//for (auto e : l)
			//   *vit++ = e;
		}

		vector<T>& operator=(initializer_list<T> l) 
		{
			vector<T> tmp(l);

			std::swap(_start, tmp._start);
			std::swap(_finish, tmp._finish);
			std::swap(_endofstorage, tmp._endofstorage);

			return *this;
		}

	private:
		iterator _start;
		iterator _finish;
		iterator _endofstorage;
	};
}

3 -> 声明

C++11提供了多种简化声明的方式,尤其是在使用模板时。

3.1 -> auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局
部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃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;
	cout << typeid(pf).name() << endl;

	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };

	//map<string, string>::iterator it = dict.begin();
	auto it = dict.begin();

	return 0;
}

3.2 -> decltype

关键字decltype将变量的类型声明为表达式指定的类型。

#define  _CRT_SECURE_NO_WARNINGS 1

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

// decltype的一些使用使用场景
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; // ret的类型是double
	decltype(&x) p;      // p的类型是int*

	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;

	F(1, 'a');

	return 0;
}

3.3 -> nullptr

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

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

感谢大佬们支持!!!

互三啦!!!

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

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

相关文章

Debian

文章目录 前言一、使用root用户操作二、配置用户使用sudo命令三、添加桌面图标显示1.打开终端2.执行安装命令3.执行成功后重启4. 打开扩展&#xff0c;配置图标 四、图形化界面关闭和打开五、设置静态IP1.查询自己系统网络接口2.修改网络配置文件 总结 前言 Debian 系统在安装…

基于Springboot+Vue的Java项目-在线文档管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

RUOYI 若依 横向菜单

保留移动端适配 小屏适配 菜单权限等 可轻松进行深度自定义菜单样式 以及分布 仅支持横向布局 如需源码 教程等 ➕ wx 技术支持 wx : 17339827025

【IEEE出版 | 中山大学主办 | 往届会后2-4个月EI检索】第五届电子通讯与人工智能学术会议(ICECAI 2024)

第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09; 2024 5th International Conference on Electronic communication and Artificial Intelligence 第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09;将于2024年5月31日-6月…

淘宝订单交易详情查询API是淘宝开放平台提供的接口,可以通过该接口获取淘宝订单的详细信息。

淘宝订单交易详情查询API是淘宝开放平台提供的接口&#xff0c;可以通过该接口获取淘宝订单的详细信息。通过该API&#xff0c;你可以获取订单的基本信息、商品信息、买家信息、物流信息等。 具体使用该API需要进行以下步骤&#xff1a; 在淘宝开放平台注册开发者账号&#xf…

QA测试开发工程师面试题满分问答15: 讲一讲InnoDB和MyISAM

InnoDB和MyISAM是MySQL中两种常见的存储引擎&#xff0c;它们在数据存储和处理方面有着显著的区别。让我们逐一来看一下它们的区别、原理以及适用场景。 区别&#xff1a; 事务支持&#xff1a;InnoDB是一个支持事务的存储引擎&#xff0c;而MyISAM不支持事务。事务是一种用于维…

L2-045 堆宝塔

L2-045 堆宝塔 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff…

C++运算符重载和日期类的实现

运算符重载 参数个数与操作个数应该一致(双目操作符就是2个参数,同时参数中包括this) 不能被重载的运算符 " .* "运算符的作用 .*就是用来调用成员函数指针的 调用 1.显式调用 运算符重载可以显式调用 eg. 2.转换调用 运算符重载增强了程序的可读性 bool operato…

SpringBoot版本配置问题与端口占用

前言 ​ 今天在配置springboot项目时遇到了一些问题&#xff0c;jdk版本与springboot版本不一致&#xff0c;在使用idea的脚手架创建项目时&#xff0c;idea的下载地址是spring的官方网站&#xff0c;这导致所下载的版本都是比较高的&#xff0c;而我们使用最多的jdk版本是jdk…

使用不锈钢微型导轨的优势!

微型导轨是一种专门用于在紧凑空间内执行高精度的机器运动控制的导轨设备。其特点是尺寸小、精确度高、刚性好、平稳性好以及使用寿命长。微型导轨的材质种类多样&#xff0c;一般包括钢、不锈钢、铝合金等。目前来说&#xff0c;不锈钢材质的使用率最为频繁&#xff0c;那么使…

Vue3从入门到实践:深度了解新组件

1.Teleport 概念&#xff1a;Teleport&#xff08;传送门&#xff09;是一个新的特性&#xff0c;用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置&#xff0c;而不受组件层次结构的限制。 下面举出例子解释&#xff1a; 1.新建App.vue文件作…

数据结构—单链表

1、链表的概念及结构 1.1链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;但在逻辑上确是连续、顺序的&#xff0c;而数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2链表的结构 如下图&#xff1a; 逻辑上的链表&#xff0c;pList是指…

AOP基础

一、AOP概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a;①记录操作日志&#xff1b;②权限控制&#xff1b;③事务管理等。 优势&#xff1a;①代码无侵入…

【GPTs分享】GPTs分享之 AskYourPDF Research Assistant​

一、简介 AskYourPDF Research Assistant 是一款高级人工智能研究助手&#xff0c;专门设计用于帮助用户高效从PDF文件和文章中提取信息。它结合了深度学习技术和自然语言处理能力&#xff0c;以便用户能够快速地查询、总结及处理文档内容&#xff0c;并能够生成与文章内容相关…

依泉LXSY LXLY电子远传水表说明书MODBUS-RTU通讯协议

这款水表的通讯协议主要包括以下内容&#xff1a; 概述 传输方式 数据帧格式 地址码 功能码 数据区 CRC校验码 生成一个CRC的流程 通讯应用格式详解 寄存器地址 通讯接口 表盘地址 这是厂家给的通讯协议&#xff0c;我亲测可以读取到水表的读数&#xff0c;精度只…

怎么理解load_average

之前我讲了cpu使用率的问题&#xff0c;cpu使用率是我们监控中非常关注的指标。 但是工作中&#xff0c;我们经常遇到业务应用已经很慢了&#xff0c;但是cpu利用率显示很低。 这种时候&#xff0c;你会发现top中load很高。 在top中&#xff0c;load average后面有3个数字。…

AtCoder ABC349 A-D题解

比赛链接:ABC349 Problem A: 签到。 #include <bits/stdc.h> using namespace std; const int maxn105; int A[maxn]; int main(){int N;cin>>N;int ans0;for(int i1;i<N;i){cin>>A[i];ans-A[i];}return 0; } Problem B: 开2个桶即可&#xff0c;具体…

西夏区第三届中华诗词大会活动方案

活动流程/比赛规则 1.【13:30-14:10】 参赛选手签到&#xff1b;领取参赛号码牌&#xff1b;分组抽签&#xff1b;拍摄赛前感言&#xff0c;集体祝福口号&#xff1b; 2.【14:10-14:25】 熟悉设备、答题环节、题目设置等&#xff0c;走台演练 3.【14:25-14:30】 播放暖场视频…

java音乐播放器系统设计与实现springboot-vue

后端技术 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快、更广泛的入门体验&#xff1b; 2、零配置&#xff1b; 3、集成了大量常用的第三方库的配置&#xff1b; Maven: 项目管理和构建自动化工具&#xff0c;用于java项目。 java: 广泛使用的编程语…

导航菜单 父级高亮 处理

// 预处理导航数据filterMenuFun (arr, uuids []) {// uuids 用来有级嵌套导航时&#xff0c;子集acitve时父级也有acitve样式arr.forEach(item > {item.uuids [item.uuid, ...uuids];item.children && this.filterMenuFun(item.children, item.uuids)});return a…