C++11---(1)

目录

一、C++11简介

二、列表初始化

2.1、{ } 初始化

三、变量类型推导

3.1、auto

3.2、decltype

为什么需要decltype

四、final和override

4.1、final

4.2、override

 五、默认成员函数控制

5.1、default修饰函数

5.2、delete修饰函数

六、nullptr


一、C++11简介

C++11是C++语言的一个重要版本,于2011年发布。它引入了许多新的特性和改进,使得C++语言更加现代化、高效和易用。一些重要的特性包括:

  1. 自动类型推导(auto关键字):允许编译器根据初始化表达式的类型推导变量的类型,简化代码书写。

  2. Lambda表达式:允许在函数内部定义匿名函数,提高代码的可读性和灵活性。

  3. 移动语义(右值引用和移动语义):引入了右值引用和移动语义,提高了程序的性能和效率。

  4. 列表初始化:引入了统一的初始化语法,使得初始化更加简洁和一致。

  5. 强类型枚举:引入了枚举类(enum class),提供了更好的类型安全性。

  6. 多线程支持(std::thread、std::mutex等):标准库中引入了多线程支持,使得并发编程更加容易。

总的来说,C++11使得C++语言更加现代化和强大,为程序员提供了更多的工具和特性来编写高效、可维护的代码

二、列表初始化

2.1、{ } 初始化

C++98中,标准允许使用花括号"{}"来对数组结构体进行统一的列表初始化:             

                                    

C++98对于自定义类型,无法使用列表初始化,在C++11中改进了

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

这也就是说,在C++11后,不止数组和结构体可以用{}初始化,变量也可以了。并且可以不使用赋值符号:

                                   

内置类型初始化

// 内置类型变量
int x1 = {10};
int x2{10};//建议使用原来的
int x3 = 1+2;
int x4 = {1+2};
int x5{1+2};
// 数组
int arr1[5] {1,2,3,4,5};
int arr2[]{1,2,3,4,5};
// 动态数组,在C++98中不支持
int* arr3 = new int[5]{1,2,3,4,5};
// 标准容器
vector<int> v{1,2,3,4,5};//这种初始化就很友好,不用push_back一个一个插入
map<int, int> m{{1,1}, {2,2,},{3,3},{4,4}};

自定义类型的列表初始化

1、单个列表初始化

class Point
{
public:
	Point(int x = 0, int y = 0): _x(x), _y(y)
{}
private:
	int _x;
	int _y;
};
int main()
{
	Pointer p = { 1, 2 };
	Pointer p{ 1, 2 };//不建议
return 0;
}

2、多个对象的列表初始化
多个对象想要支持列表初始化,需给该类(模板类)添加一个带有initializer_list类型参数的构造函数即可。
注意:initializer_list是系统自定义的类模板,该类模板中主要有三个方法:begin()、end()迭代器以及获取区间中元素个数的方法size()

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "这是日期类" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	//C++11容器都实现了带有initializer_list类型参数的构造函数
	vector<Date> vd = { { 2022, 1, 17 }, Date{ 2022, 1, 17 }, { 2022, 1, 17 } };
	return 0;
}

三、变量类型推导


3.1、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();
    return 0;
}

3.2、decltype

为什么需要decltype

auto使用的前提是:必须要对auto声明的类型进行初始化,否则编译器无法推导出auto的实际类型。但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间,代码不会运行,此时auto也就无能为力。

decltype是根据表达式的实际类型推演出定义变量时所用的类型,比如

1、推演表达式类型作为变量的定义类型

int a = 10, b = 20;
decltype(a + b)c;
cout << typeid(c).name() << endl;
//输出结果是int

2. 推演函数返回值的类型

template<class T1, class T2>
T1 Add(const T1& left, const T2& right)
{
	return left + right;
}
int main()
{
	cout << typeid(Add(1, 2)).name() << endl;
	return 0;
}
//输出结果是int

四、final和override

4.1、final

1、final修饰类的时候,表示该类不能被继承

class A final //表示该类是最后一个类
{
private:
	int _year;
};
class B : public A //无法继承,报错
{

};

2、final修饰虚函数时,这个虚函数不能被重写

class A 
{
public:
	virtual void fun() final//修饰虚函数
	{
		cout << "this is A" << endl;
	}
private:
	int _year;
};
class B : public A
{
public:
	virtual void fun()//父类虚函数用final修饰,表示最后一个虚函数,无法重写
	{
		cout << "this is B" << endl;
	}
};

4.2、override

检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错

class A 
{
public:
	virtual void fun()
	{
		cout << "this is A" << endl;
	}
private:
	int _year;
};
class B : public A
{
public:
	virtual void fun1() override  //报错,“使用override声名的成员函数不能重写基类成员”
	{
		cout << "this is B" << endl;
	}
};

 五、默认成员函数控制

在C++中对于空类编译器会生成一些默认的成员函数,比如:构造函数、拷贝构造函数、运算符重载、析构函数和&和const&的重载、移动构造、移动拷贝构造等函数。如果在类中显式定义了,编译器将不会重新生成默认版本。有时候这样的规则可能被忘记,最常见的是声明了带参数的构造函数,必时则需要定义不带参数的版本以实例化无参的对象。而且有时编译器会生成,有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成。

5.1、default修饰函数

在C++11中,可以在默认函数定义或者声明时加上=default,从而显式的指定编译器生成该函数的默认版本(默认成员函数),用=default修饰的函数称为显式缺省函数

class A 
{
public:
	A() = default;//让编译器默认生成无参构造函数
	A(int year)    //这样不写缺省值的时候,就不需要自己在去实现一个默认的无参构造函数
		:_year(year)
	{}
	void fun()
	{
		cout << "this is A" << endl;
	}
private:
	int _year;
};

5.2、delete修饰函数

如果能想要限制某些默认函数的生成,在C++98中,是该函数设置private,并且不给定义,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数

class A
{
public:
	A() = default;
	A(int a) : _a(a)
	{}
	//C++11
	// 禁止编译器生成默认的拷贝构造函数以及赋值运算符重载
	A(const A&) = delete;
	A& operator=(const A&) = delete;
private:
	int _a;
	//C++98,设置成private就可以了
	A(const A&) = delete;
	A& operator=(const A&) = delete;
};

六、nullptr

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

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

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

相关文章

STM32F1 - 中断优先级

Interrupt Priority 1> STM32F103ZET6异常向量表2> 中断优先级寄存器NVIC_IPRx3> 中断优先级分组4> 例程&#xff1a;设置EXTI4中断优先级5> 例程&#xff1a;设置SysTick中断优先级6> 为什么不能用NVIC_Init()设置Systick优先级&#xff1f;7> 函数NVIC_…

【数据分享】2001~2020年青藏高原植被净初级生产力数据集

各位同学们好&#xff0c;今天和大伙儿分享的是2001~2020年青藏高原植被净初级生产力数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 朱军涛. (2022). 青藏高原植被净初级生产力数据集&#xff08;2001-2020&#xff09;. 国家青藏高原数据中心. …

最简单的基于 FFmpeg 的封装格式转换器(无编解码)

最简单的基于 FFmpeg 的封装格式转换器&#xff08;无编解码&#xff09; 最简单的基于 FFmpeg 的封装格式转换器&#xff08;无编解码&#xff09;正文结果工程文件下载 最简单的基于 FFmpeg 的封装格式转换器&#xff08;无编解码&#xff09; 参考雷霄骅博士的文章&#xf…

文件上传漏洞--Upload-labs--Pass03--特殊后缀与::$DATA绕过

方法一&#xff1a;特殊后缀绕过&#xff1a; 一、什么是特殊后缀绕过 源代码中的黑名单禁止一系列后缀名 之外的后缀&#xff0c;称之为‘特殊后缀名’&#xff0c;利用其来绕过黑名单&#xff0c;达到上传含有恶意代码的文件的目的。 二、代码审计 接下来对代码逐条拆解进行…

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…

【点云】生成有凹凸的平面

文章目录 前言高斯函数原理代码保存 测试测试1 &#xff1a;领域曲率代码测试2&#xff1a;高斯曲率代码 加上噪点测试1测试2 总结 前言 尝试用一些数据生成有凹凸面的点云。 我们姑且把z轴当成有凹凸的缺陷&#xff0c;x轴和y轴共同组成一个平面。 高斯函数 原理 高斯函数w…

nba2k23 中国梦之队面补名单

nba2k23 中国梦之队面补名单 提示&#xff1a;本面补为名单形式&#xff0c;内含中国国家队2000、2008、2015、2019面补名单&#xff0c;安装后多队同时存在。 下载地址&#xff1a; https://www.changyouzuhao.cn/12759.html

Python算法题集_验证二叉搜索树

Python算法题集_验证二叉搜索树 题98&#xff1a;验证二叉搜索树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【DFS递归终止检测】3) 改进版二【BFS迭代终止检测】 4. 最优算法 本文为Python算法题集之一的代码示例 题…

【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

目录 一、说明二、测试系统安装的健康性三、安装64位的openGL四、写给程序员的4. 1 函数库介绍4.2 库内函数的命名 五、常见库的函数介绍5.1 OpenGL 核心库 GL5.2 OpenGL 实用库 GLU5.3 OpenGL 工具库 GLUT5.4 Windows 专用库 WGL 六、错误引发点和异常追踪6.1 错误检查开关6.…

时间序列预测模型:ARIMA模型

1. ARIMA模型原理介绍 ARIMA模型&#xff0c;全称为自回归积分滑动平均模型&#xff08;Autoregressive Integrated Moving Average Model&#xff09;&#xff0c;是一种常用的时间序列预测方法。ARIMA模型通过对时间序列数据的差分化处理&#xff0c;使非平稳时间序列数据变…

CSS之margin塌陷

margin塌陷 CSS中的外边距塌陷&#xff08;Margin Collapse&#xff09;问题是指在垂直方向上&#xff0c;当两个或多个块级元素的边距相遇时&#xff0c;它们之间的距离不是它们各自边距的总和&#xff0c;而是其中的最大值。这种现象主要出现在块级元素的上下外边距之间。 &…

【机器学习笔记】10 人工神经网络

人工神经网络发展史 1943年&#xff0c;心理学家McCulloch和逻辑学家Pitts建立神经网络的数学模型&#xff0c;MP模型 每个神经元都可以抽象为一个圆圈&#xff0c;每个圆圈都附带特定的函数称之为激活函数&#xff0c;每两个神经元之间的连接的大小的加权值即为权重。 1960年…

springboot194基于springboot的医药管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的医药管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **…

【STM32 CubeMX】串口编程DMA

文章目录 前言一、DMA方式1.1 DMA是什么1.2 CubeMX配置DMA1.3 DMA方式函数使用DMA的发送接收函数 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项至关重要的功能&#xff0c;它允许单片机与外部设备进行数据交换&#xff0c;如传感器、显示器或其他设备。然而&#xff0…

C++ //练习 7.13 使用istream构造函数重写第229页的程序。

C Primer&#xff08;第5版&#xff09; 练习 7.13 练习 7.13 使用istream构造函数重写第229页的程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******************************************************************…

太阳光模拟器助力于太阳光对金属铝靶材影响

1. 引言 金属铝靶材是一种被广泛应用于薄膜制备领域的金属材料&#xff0c;具有高纯度、均一性好、结构致密等优点。其制备工艺主要包括冶金法、电化学法、物理气相沉积法等&#xff0c;其中电化学法制备的铝靶材品质最佳&#xff0c;价格也比较实惠。 其中包含&#xff1a; …

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)

效果演示 文章目录 效果演示系列目录前言拖放、交换物品绘制拖拽物品插槽UI修改Inventory&#xff0c;控制拖放功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xf…

Linux桌面

系统信息的截图 登录界面右下角可以切换 Ubuntu on Wayland &#xff0c;虽然还是测试版&#xff0c;不过体验已经比之前的 Xorg 好多了&#xff0c;最笔记本上使用最影响体验的高分屏适配功能&#xff0c;在 wayland 中也是几乎完美支持的。 卸载 snap 这个 snap 是 Ubuntu …

GEO文章套路,数据下载和批次效应处理

原文链接&#xff1a; SCI文章复现 | GEO文章套路&#xff0c;数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程&#xff0c;我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

springboot集成elk实现日志采集可视化

一、安装ELK 安装ELK组件请参考我这篇博客&#xff1a;windows下安装ELK(踩坑记录)_windows上安装elk教程-CSDN博客 这里不再重复赘述。 二、编写logstash配置 ELK组件均安装好并成功启动&#xff0c;进入到logstash组件下的config文件夹&#xff0c;创建logstash.conf配置…