【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录

 前言:

委托构造函数:

类内初始化:

空指针:

枚举类:

总结:


 前言:

        C++的学习难度大,内容繁多。因此我们要及时掌握C++的各种特性,因此我们更新本篇文章,向大家介绍C++的新增特性。

委托构造函数:

委托构造函数是指一个类的构造函数调用另一个类的构造函数,以减少代码冗余,提高代码可读性。C++11引入了委托构造函数的特性。

下面是一个委托构造函数的例子:

class A {
public:A(int a, int b) : x(a), y(b) {}A(int a) : A(a, 0) {}  // 委托构造函数,调用上面的构造函数并初始化y为0
private:int x, y;
};

在上面的例子中,类A有两个构造函数,其中第二个构造函数使用了委托构造函数的特性,调用了第一个构造函数并将y初始化为0。这样,在创建对象时,只需要指定一个参数,即可调用第二个构造函数,不需要再写重复的代码。

下面是一个使用委托构造函数的例子:

A a1(1, 2);  // 调用第一个构造函数
A a2(2);     // 调用第二个构造函数,x为2,y为0

在上面的例子中,创建了两个对象a1和a2,分别调用了类A的不同构造函数。其中,a2对象使用了委托构造函数的特性。

类内初始化:

C++11引入了类内初始化的特性,可以在类的定义中为成员变量设置默认值。这样,当创建对象时,成员变量就会被初始化为默认值,可以避免成员变量未被初始化的问题。

下面是一个类内初始化的例子:

class A {
public:int x = 1;     // 类内初始化,设置默认值为1double y = 2.0;string s = "hello";
};

在上面的例子中,类A的成员变量x、y、s都使用了类内初始化的特性,分别设置了默认值为1、2.0、"hello"。当创建对象时,会自动将成员变量初始化为默认值。

下面是一个使用类内初始化的例子:

A a1;      // 创建对象a1,x=1, y=2.0, s="hello"
A a2 {3};  // 创建对象a2,手动指定x的值为3,y=2.0,s="hello"

在上面的例子中,创建了两个对象a1和a2,分别使用默认的构造函数和列表初始化的方式进行初始化。可以看到,a1对象的x成员变量被默认初始化为1,而a2对象手动指定了x的值为3。

空指针:

C++中的空指针是指指针变量没有指向任何有效的内存位置。可以使用空指针来检测指针是否已经被成功初始化或者指针是否指向有效的内存地址。

C++中的空指针可以使用nullptr关键字进行初始化,也可以使用NULL或0进行初始化。nullptr是C++11中引入的新关键字,将空指针与整数0进行区分开来,推荐使用nullptr来初始化空指针。

下面是一个空指针的例子:

int* p1 = nullptr;  // 使用nullptr关键字初始化空指针
int* p2 = NULL;     // 使用NULL宏初始化空指针
int* p3 = 0;        // 使用0初始化空指针if (p1 == nullptr) {cout << "p1 is a null pointer" << endl;
}if (p2 == NULL) {cout << "p2 is a null pointer" << endl;
}if (p3 == nullptr) {cout << "p3 is a null pointer" << endl;
}

在上面的例子中,声明了三个指针变量p1、p2、p3,并使用不同的方式初始化为空指针。然后使用if语句检测每个指针变量是否是空指针,并输出相应的信息。可以看到,p1、p2、p3都是空指针,if语句的条件都为真,输出了相应的信息。

使用nullptr的优点:

1. 增强类型安全性:在 C++ 中,一个空指针可以用 0 或 NULL 来表示,但是它们实际上都是一个整数常量。因此,如果将一个指针赋值为整数值时,编译器可能不会给出任何警告,这可能会导致程序出现意料之外的行为。使用 nullptr 可以有效避免这种情况,因为 nullptr 是一个类型为 nullptr_t 的特殊常量,不能被隐式地转换为其他类型,只能赋值给指针类型。

2. 与函数重载结合使用:在 C++ 中,函数会根据参数的类型和数量匹配到不同的版本。如果某个函数有多个重载版本,其中一个版本的参数类型为空指针,而另一个版本的参数类型为整数,那么当我们传递 0 时,编译器可能无法确定我们需要调用哪个版本的函数。使用 nullptr 可以显式地指定空指针类型,避免这种情况。

3. 跟踪函数重载调用:nullptr 的类型是 nullptr_t,而不是一个整数类型在函数调用时可以通过 nullptr 来推断参数类型。这对于模板编程和一些类型无关的代码非常有用。

总的来说,nullptr 可以提高代码的可读性、可维护性和安全性,是 C++ 程序员应该使用的空指针表示方式。

枚举类:

C++11 引入了一种新的枚举类型,称为枚举类(enum class),也称作强类型枚举(scoped enum)。与传统的枚举类型相比,枚举类有以下几个优点:

1. 命名空间隔离:使用枚举类可以定义一个新的命名空间,避免命名冲突和全局名称空间污染。

2. 支持强类型:枚举中的值不能被隐式转换为整数类型,必须通过显式转换才能进行类型转换。这可以避免在不同枚举类型之间发生不必要的转换,提高代码的类型安全性。

3. 支持指定底层类型:可以指定枚举类型的底层类型,可以是任何整数类型,而不仅仅是 int 类型。这样可以提高内存使用效率,并且可以在不同平台上保证枚举类型的大小和行为。

枚举类的定义方式与传统的枚举类型类似,但需要在关键字 enum 后加上 class 或 struct 关键字。可以使用如下方式定义一个枚举类:

enum class Color {RED,GREEN,BLUE
};

在枚举类中,每个枚举都是有名字的,并且可以在枚举类的作用域之外使用双冒号(::)来限定名称。例如,在上面的例子中,可以使用以下方式声明和初始化一个枚举类型的变量:

Color c = Color::RED;

需要注意的是,枚举类可以指定底层类型,表示枚举类型的默认底层类型是 int,可以使用关键字 typename 来指定其他整数类型。例如,我们可以定义一个使用 unsigned short 类型作为底层类型的枚举类:

enum class Color : unsigned short {RED = 1,GREEN = 2,BLUE = 4
};

这种方式有助于减小内存使用,并且可以确保枚举类型在不同平台上的行为是一致的。

总的来说,枚举类是 C++11 中一个非常有用的新特性,可以提高代码的类型安全性、可读性和可维护性。在实际编程中,应该尽可能地使用枚举类来定义枚举类型。

总结:

        本文因为篇幅原因并没有介绍完,我们在下一篇文章中还会接着介绍剩下的六个特性,这十个新增特性再一次丰富了C++的使用,因此我们要对这十个新增特性足够熟悉。

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

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

相关文章

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存&#xff0c;那么既然引入缓存&#xff0c;那就会有一个缓存与数据库数据一致性的问题。 首先&#xff0c;我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式&#xff0c;是最常见的Redis缓存模式&a…

【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【深入探究人工智能】:历史、应用、技术与未来

深入探究人工智能 前言人工智能的历史人工智能的应用人工智能的技术人工智能的未来当代的人工智能产物结语&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &am…

LangChain大型语言模型(LLM)应用开发(三):Chains

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

【UE4 塔防游戏系列】10-防御塔升级

目录 效果 步骤 一、根据防御塔等级修改子弹伤害 二、根据防御塔等级修改子弹速度 三、根据防御塔等级修改检测半径 四、根据防御塔等级修改子弹颜色 五、根据防御塔等级修改换弹时间 效果 步骤 一、根据防御塔等级修改子弹伤害 1. 打开“TowerBaseBullet_Child”&…

【ArcGIS Pro二次开发】(48):三调土地利用现状分类面积汇总统计

之前做了一个三调三大类面积统计&#xff0c;有小伙伴反映太粗糙&#xff0c;想要一个完整的地类面积汇总表。 【ArcGIS Pro二次开发】(35)&#xff1a;三调三大类面积统计 本质上并没有多少难度&#xff0c;之前也做过类似的用地用海汇总表&#xff0c;于是拿出来改一改就好了…

window 命令笔记

1.查看端口 输入“netstat -ano”并回车可以获得所有网络连接活动的列表&#xff0c;在表中&#xff0c;本地地址IP地址后方冒号之后的即是端口号&#xff1a; 如果想要查找特定的端口可以输入命令“netstat -aon|findstr “端口号””&#xff0c;例如“netstat -aon|findstr…

My_window类(带有next和quit按钮)

运行代码&#xff1a; //My_window类&#xff08;带有next和quit按钮&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"//--…

C++基础算法离散化及区间合并篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解了双指针&#xff0c;位运算&#xff0c;离散化以及区间合并。…

有效的括号(C)

bool isValid(char* s) {ST st;StackInit(&st);while (*s) //遍历 -- 与\0终止{//是左括号 压栈if (*s ( || *s [ *s {){StackPush(&st, *s);s;}else{//应对样例&#xff1a; ’]if (StackEmpty(&st)){StackDestroy(&st);return false;}//不是左括号 应该就…

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树、Pipeline、交叉验证

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树案例 除了scikit-learn外&#xff0c;在spark中也提供了机器学习库&#xff0c;即Spark MLlib。 在Spark MLlib机器学习库提供两套算法实现的API&#xff1a;基于RDD API和基于DataFrame API。今天&#xff0c;主要介绍下Data…

docker k8s

Docker docker到底与一般的虚拟机有什么不同呢&#xff1f; 我们知道一般的linux系统即GNU/Linux系统包括两个部分&#xff0c;linux系统内核GNU提供的大量自由软件&#xff0c;而centos就是众多GNU/Linux系统中的一个。 虚拟机会在宿主机上虚拟出一个完整的操作系统与宿主机完…

在 3ds Max 中对链模型进行摆放姿势处理

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 建模和“摆姿势”3D链可能看起来是一项繁琐的工作&#xff0c;但实际上可以通过使用阵列工具并将链中的链接视为骨骼来轻松完成。在本教程中&#xff0c;我将向您展示如何对链条进行建模&#xff0c;并通过…

oled拼接屏在柳州的户外广告中有哪些应用展现?

柳州oled拼接屏是一种高端的显示屏&#xff0c;它采用了OLED技术&#xff0c;具有高亮度、高对比度、高色彩饱和度、高刷新率等优点&#xff0c;能够呈现出更加真实、清晰、细腻的图像效果。 同时&#xff0c;柳州oled拼接屏还具有拼接功能&#xff0c;可以将多个屏幕拼接在一…

vue element select下拉框回显展示数字

vue element select下拉框回显展示数字 问题截图&#xff1a; 下拉框显示数字可以从数据类型来分析错误&#xff0c;接收的数据类型是字符串&#xff0c;但是value是数字类型 <el-form-item prop"classifyLabelId" :label"$t(item.classifyLabelId)"…

GUI-Menu菜单实例

运行代码&#xff1a; //GUI-Menu菜单实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window…

常见的网络攻击

​ 1.僵木蠕毒 攻击业内习惯把僵尸网络、木马、蠕虫、感染型病毒合称为僵木蠕毒。从攻击路径来看&#xff0c;蠕虫和感染型病毒通过自身的能力进行主动传播&#xff0c;木马则需要渠道来进行投放&#xff0c;而由后门木马&#xff08;部分具备蠕虫或感染传播能力&#xff09;构…

Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件4. 接口层1.整体架构图 MyBatis 分…

智能优化算法——灰狼优化算法(PythonMatlab实现)

目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法&#xff0c;它的…

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…