C++11语法(基础)【一】

news2024/9/24 13:52:09

目录

1. C++11简介

2. 统一的列表初始化

2.1 {}初始化

2.2 std::initializer_list

3. 声明

3.1 auto

3.2 decltype

3.3 nullptr


声明:C++11我会分几篇来讲,每一篇我都会讲几种特性。

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能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更加强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个 重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程 主要讲解实际中比较实用的语法。

以下链接为C++11的文档,大家若有需要或则感兴趣可以看看文档

https://en.cppreference.com/w/cpp/11

小故事:

1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫 C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。

2. 统一的列表初始化

2.1 {}初始化

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

struct Point
{
	int _x;
	int _y;
};

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

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

struct Point
{
	int _x;
	int _y;
};
int x = 1;
int y{ 2 };
int array1[]{ 1,2,3,4,5 };
int array2[5]{ 0 };
Point p{ 1,2 };
// C++11中列表初始化也可以适用于new表达式中
int* p2 = new int[4] {0};

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

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, 10, 1);// old style

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

运行截图:

我们确实可以从结果看到C++11支持的列表初始化会调用构造函数初始化。

2.2 std::initializer_list

std::initializer_list的介绍文档:

http://www.cplusplus.com/reference/initializer_list/initializer_list/

std::initializer_list是什么类型:

int main()
{
	// the type of il is an initializer_list
	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=的参数,这样就可以用大括号赋值。比如:

http://www.cplusplus.com/reference/list/list/list/

http://www.cplusplus.com/reference/vector/vector/vector/

http://www.cplusplus.com/reference/map/map/map/

http://www.cplusplus.com/reference/vector/vector/operator=/

以上链接分别是list容器的构造函数,vector容器的构造函数,map的构造函数以及vector的赋值运算符重载的文档。

示例代码:

int main()
{
	vector<int> v = { 1,2,3,4 };
	list<int> l = { 1,2,3 };
	// 这里{"苹果", "apple"}会先初始化构造一个pair对象
	map<string, string> m = { {"苹果","apple"},{"香蕉","banana"} };
	// 使用大括号对容器赋值
	v = { 10, 20, 30 };

	return 0;
}

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

namespace kuruomi
{
	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。
			//因为编译器无法确认此处的iterator是类型还是变量,不加的话编译器会报错。
			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;
	};
}

int main()
{
	kuruomi::vector<int> v = { 1,2,3,4 };
	v = { 10, 20, 30 };
	return 0;
}

这三个成员变量分别是数组的开头、结尾、空间边界,这里我们就是利用initializer_list参数进行初始化,用迭代器的方式进行拷贝,赋值运算符重载就是复用了拷贝构造。

3. 声明

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

3.1 auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型判断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

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();
	cout << typeid(it).name() << endl;
	return 0;
}

运行截图:

3.2 decltype

关键字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,用于表示空指针。

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

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

相关文章

SOMEIP_ETS_128: SD_Multicast_FindService_Major_Minor_Version_set_to_all

测试目的&#xff1a; 验证DUT能够对设置了主版本号和次版本号为0xFF的多播FindService请求做出响应&#xff0c;并为每个请求至少回复一个单播OfferService消息。 描述 本测试用例旨在确保DUT能够正确处理多播FindService请求&#xff0c;特别是当请求中的主版本号和次版本…

【AIGC】ChatGPT提示词助力广告文案、PPT制作与书籍推荐的高效新模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效广告推销文案提示词使用方法 &#x1f4af;AI自动生成PPT全流程提示词使用方法 &#x1f4af;精选书籍推荐爆款文案提示词使用方法 &#x1f4af;小结 &#x1f4af;…

vulnhub(13):Digitalworld.local JOY(ftp 的未授权文件读写漏洞、文件覆盖提权)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.171 Host is up (0.00020s latency). ​ 171是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn 192.168.72.171 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/sca…

【Android】 IconFont的使用

SVG 的特点&#xff1a; 矢量图形&#xff1a;SVG 使用基于路径的矢量图形&#xff0c;这意味着图形可以无限放大而不失真&#xff0c;非常适合需要多种分辨率的应用。 可伸缩性&#xff1a;SVG 文件的大小通常比位图小&#xff0c;这使得它们在网页上加载更快。 编辑和创作&…

【STM32 ST-LINK Utility】工具使用和如何编译HEX和BIN文件

【STM32 ST-LINK Utility】工具使用和如何编译HEX和BIN文件 一、STM32 ST-LINK UtilitySTM32 ST-LINK Utility简介功能概述&#xff1a; STM32 ST-LINK Utility作用使用场景&#xff1a; 二、KEIL生成HEX和BIN文件1. 生成HEX文件2. 生成BIN文件 三、STM32 ST-LINK Utility烧录1…

【linux经典工具】strace-就十分钟你也能成为性能调优专家

strace 是什么 strace是一款功能强大的 Linux 进程监控和诊断工具。主要作用就是&#xff1a;用于调试程序、解决问题、拦截和记录系统调用以及跟踪正在运行的进程。它能输出了程序如何与系统交互的过程&#xff0c;尤其是在无法获取源代码的情况下&#xff08;那些开源工具、…

学习threejs,绘制任意字体模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

前端开发之装饰器模式

介绍 装饰器模式 是在不修改对象内部结构的情况下&#xff0c;动态地给对象添加功能的一种设计模式。在软件开发中&#xff0c;有时候我们需要为已有对象添加一些额外的行为&#xff0c;但不希望修改该对象的代码&#xff0c;装饰器模式可以很好的满足这一需求。 在TypeScrip…

面向AI的数据治理市场前景如何?

面向AI的数据治理市场前景如何&#xff1f; 前言面向AI的数据治理 前言 在这个数字化飞速发展的时代&#xff0c;数据已经成为了我们生活和工作中不可或缺的一部分。就像一把双刃剑&#xff0c;既能为我们带来巨大的机遇&#xff0c;也可能带来一些挑战。而数据治理&#xff0…

[spring]springboot日志

文章目录 一. 日志的用途二. 打印日志三. 日志框架门面模式(外观模式)SLF4J框架介绍 四. 日志格式日志级别配置日志级别日志持久化配置日志文件分割配置日志格式 五. 更简单的日志输出 一. 日志的用途 二. 打印日志 得到日志对象: 需要使用日志工厂LoggerFactory RestControl…

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

OpenCV目标检测(1)模板匹配函数matchTemplate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个模板与重叠的图像区域进行比较。 该函数在图像中滑动&#xff0c;使用指定的方法将大小为 w h w \times h wh的重叠块与模板 templ 进行…

安全运维教程(非常详细)从零基础入门到精通,看完这一篇就够了_网络运维手册

一、安全运维-网络 1、IP地址相关 IP地址属于网络层地址&#xff0c;用于标识网络中的节点设备。 IP地址由32bit构成&#xff0c;每8bit一组&#xff0c;共占用4个字节。 IP地址由两部分组成&#xff0c;网络位和主机位。 IP地址分类&#xff1a; 类别网络位子网掩码私有地…

基于单片机的智能校园照明系统

由于校园用电量较大&#xff0c;本设计可以根据实际环境情况的改变&#xff0c;实现实时照明的控制。本设计以单片机芯片为控制芯片&#xff0c;热释电传感器采集教室中学生出入的信息&#xff0c;并把信息传递给单片机芯片&#xff0c;单片机芯片根据传感器传递过来的信息来控…

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

水印与标志检测系统源码分享

水印与标志检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

深度解读数字化转型实施中的常见挑战与解决方案

为何深入理解数字化转型中的挑战至关重要&#xff1f; 数字化转型不仅仅是技术升级的过程&#xff0c;更是企业在面对市场变化、客户需求以及内部效率提升等多方面压力时&#xff0c;进行的系统性变革。然而&#xff0c;数字化转型并非一蹴而就&#xff0c;且在实际实施过程中…

app store预览和截屏最新要求6.9寸截屏,没真机的解决方案

IOS又升级了&#xff0c;最新的iphone 16&#xff0c;新出的iphone 16 pro max是6.9英寸的。 而app store的上架流程也随机更新了&#xff0c;不再需要之前的5.5寸屏截图&#xff0c;改为需要6.9寸屏的截图了 5.5寸那些老古董终于退出历史舞台 但是问题来了&#xff0c;现在…

电源设计的艺术:从底层逻辑到工程实践

在电子工程的世界里&#xff0c;电源设计是核心中的核心。它不仅是电子设备的能量源泉&#xff0c;更是整个系统稳定运行的基石。随着科技的不断进步&#xff0c;电源设计的要求也越来越高&#xff0c;从效率、稳定性到体积、成本&#xff0c;每一个维度都是工程师们不断追求的…

Linux相关概念和重要知识点(7)(git、冯诺依曼体系结构)

1.git &#xff08;1&#xff09;版本控制和版本控制器 当我们修改一个项目的时候&#xff0c;一般都会先留下一个备份再修改&#xff0c;并将修改的文件命名为第一次修改、第二次修改......当需要途中的任何版本&#xff0c;或是需要回退到之前的版本时&#xff0c;都能够找…