【从零开始学习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…

使用Shell制作MySQL自动复制日库月库生成新的日库和月库脚本

日库生成脚本daily.sh #!/bin/bash . /etc/profile . ~/.bash_profile HOSTNAME"127.0.0.1" #数据库信息 PORT"3306" USERNAME"root" PASSWORD"123456" DBNAME"datatest" #要…

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

深入探究人工智能 前言人工智能的历史人工智能的应用人工智能的技术人工智能的未来当代的人工智能产物结语&#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”&…

现代C++语言核心特征解析——专栏介绍

本专栏用来介绍C新特性&#xff0c;其中包括C11、C14、C17、C20的特性。 下面是C各个版本的出现时间&#xff1a; C版本 时间C112011&#xff5e;2013C142014&#xff5e;2016C172017&#xff5e;2019C202020&#xff5e;2022C232023&#xff5e; 接下来特性更新的顺序不会按…

52 类 110 个常用 Java 组件和框架整理

目录 WEB 容器 数据库 缓存 消息队列 负载均衡 分布式存储 数据库集群 分布式协调 大数据相关 日志收集与分析 搜索 系统监控 分库分表 微服务 RPC 框架 网络框架 MVC 框架 数据层框架 数据库连接池 Redis 客户端 Rest 接口设计与开发 数据参数校验 安全…

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

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

python类中的@classmethod和@staticmethod

classmethod classmethod修饰符对应的函数不需要实例化&#xff0c;无需self参数&#xff0c;但需要cls参数以调用类的属性、类的方法 class A:a 10def printb(self, b):print(b)classmethoddef printa(cls):print(cls.a)print(cls().printb(5))A.printa()"""…

scrapy---爬虫中间件和下载中间件

爬虫中间件 # 爬虫中间件 (了解) middlewares.py class MysfirstscrapySpiderMiddleware:classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s cls()crawler.signals.connect(s.spider_opened, signalsignals.spider_opene…

JavaScript的static、this、super关键字介绍

JavaScript的static、this、super关键字介绍 static关键字&#xff1a; ☆ static关键字用于定义类的静态方法和静态属性。 ☆ 静态方法是直接与类相关联的方法&#xff0c;不需要实例化类即可调用。 ☆ 静态属性是类本身的属性&#xff0c;而不是实例的属性。 ☆ 在静态方…

Git学习总结

Git学习 目录 Git学习1.基础1.1 Git Commit:提交记录1.2 Git Branch:创建分支1.3 Git Merge:合并分支的方式一1.4 Git Rebase:合并分支的方式二1.5 查看提交记录&#xff1a;提交历史、详细信息、commit_hash1.6 在提交树上移动 2. 高级2.1 HEAD2.2 相对引用2.3 使用相对引用强…

css 弹性布局的详细说明

CSS弹性布局&#xff08;Flexible Box Layout&#xff0c;简称Flexbox&#xff09;是一种用于创建自适应和可伸缩布局的CSS模块。它提供了一种简单而强大的方式来对容器中的子元素进行布局&#xff0c;使它们能够自动调整大小、排列和对齐。 Flexbox通过在容器和子元素上应用一…

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"//--…

解决错误 “Plugin ‘maven-clean-plugin:3.1.0‘ not found“ 的方法详解

系列文章目录 文章目录 系列文章目录前言一、检查 Maven 插件版本&#xff1a;二、检查 Maven 仓库&#xff1a;三、检查 Maven 配置&#xff1a;总结 前言 在使用 Maven 构建项目时&#xff0c;可能会遇到错误信息 “Plugin ‘maven-clean-plugin:3.1.0’ not found”&#x…

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…