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

news2025/1/9 2:08:26

目录

 前言:

委托构造函数:

类内初始化:

空指针:

枚举类:

总结:


 前言:

        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;     // 类内初始化,设置默认值为1
    double 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.coloradmin.cn/o/685945.html

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

相关文章

部署vue element-ui admin报错(vue2)

部署vue element-ui admin报错(vue2) 目录 部署vue element-ui admin报错(vue2) 一、官方安装说明 二、部署报错的关键影响因素 2.1、“开发模板”版本 2.2、完整版 2.2.1、基础知识和基础依赖 2.2.2、原理-安装过程 三、完整版 3.3、win10环境 四、效果 4.1、win7…

云安全技术——kvm虚拟化技术

目录 10-1 kvm简介 10-2 在CentOS 7 图形化界面下安装KVM 使用IDEA开发读写MySQL数据库程序 实验目的 了解 CentOS7图形化界面的部署方法 了解 KVM的组成和作用 了解 KVM的技术架构 了解KVM的安装方法 了解 KVM创建虚拟机的方法 了解KVM的常用管理命令 实验要求 能部署图形化…

为什么建议孩子学Python?理由都在这!

近几年&#xff0c;越来越多的家长选择让孩子学习编程&#xff0c;以此提高孩子的逻辑思维、信息素养等综合能力。 Python作为一种计算机程序设计语言&#xff0c;在科技行业中有广泛的应用&#xff0c;逐渐成为少儿编程教育中必学课程之一。今天&#xff0c;编编就为大家详细…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了HTML / JSP编辑器、智能代码完成和内容辅助等功能&#xff0c;本文将继续介绍Emmet支持、Outline 视图功能等。 MyEclipse v2023.1正式版下载 如果您有HTML或JSP文件要编辑&#xff0c;这里…

chatgpt赋能python:Python聊天程序:现代化交流的必备工具

Python聊天程序&#xff1a;现代化交流的必备工具 在信息技术快速发展的现代社会&#xff0c;聊天作为一种流行的交流方式已经取代了传统的语音电话和短信。由于智能手机和电脑的广泛普及&#xff0c;越来越多的人习惯于使用聊天软件来与朋友、家人和同事保持联系。因此&#…

GBASE南大通用携手麒麟软件、索信达 共推金融信创联合解决方案

在国家信创战略推动下&#xff0c;我国正逐步实现基础硬件-基础软件-行业应用软件的国产化替代。信创浪潮中&#xff0c;各产业链以及不同垂直细分领域的创新主体&#xff0c;正以开放、创新、团结的姿态&#xff0c;形成高凝聚力的生态合作&#xff0c;共推信创产业发展&#…

【Java】JVM学习(三)

JVM的整体内存结构 本地方法栈 本地方法栈跟 Java 虚拟机栈的功能类似&#xff0c;Java 虚拟机栈用于管理 Java 函数的调用&#xff0c;而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的&#xff0c;而是由 C 语言实现的(比如Object.hashcode方法)。 …

PCA(主成分分析)

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示&#xff0c;可用于提取数据的主要特征分量&#xff0c;常用于高维数据的降维。数据降维是无监督学习的另外一个常见问题。 数据的向量表示及降维问题 …

PostgreSQL 如何对索引进行分析和处理

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

智慧煤矿4G物联网方案,矿山矿井远程监控管理4G网关应用

随着经济发展煤矿需求不断激增&#xff0c;矿山矿井普遍处于偏远山区&#xff0c;生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题&#xff0c;利用网关对现场终端设备连接组网&#xff0c;实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛&#xff0c;户外环境…

《Opencv3编程入门》学习笔记—第八章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第八章 图像轮廓与图像分割修复 一、查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线&#xff0c;其表示方法可能根据不同的情况而有所不…

FFmpeg 播放器实现音视频同步的几种方式

我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染&#xff0c;本文将实现播放器的最后一个重要功能&#xff1a;音视频同步。 老人们经常说&#xff0c;播放器对音频和视频的播放没有绝对的静态的同步&#xff0c;只有相对的动态的同步&#…

深度学习管理工具

1. mlflow https://zhuanlan.zhihu.com/p/363673389 官方文档&#xff1a; https://www.mlflow.org/docs/latest/index.html https://zhuanlan.zhihu.com/p/67173051 在跟踪实验时&#xff0c;通过运行 mlflow ui 后在 http&#xff1a;// localhost&#xff1a;5000 中进行…

ranger,hive,hdfs的三者的权限管理

ranger&#xff0c;hive&#xff0c;hdfs的三者的权限管理 情况一&#xff1a;连接datagrip 用户在hdfs上的权限 可以看出只给了用户write权限&#xff0c;尝试登录xwq用户&#xff0c;在datagrip上登录成功 经过实验验证&#xff1a;要想使用datagrip或者hive-cli登录hive…

C++11【一】

文章目录 一、C11简介二、右值引用三、可变参数模板四、 empacle_back(移动构造/赋值)五、简单特性 一、C11简介 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了很多新特性&#xff0c;比如&#xff1a;类型推导(auto关键字)、Lambda表达式、线程库、列表初始化…

电源浪涌保护器加装后备保护器的作用

随着现代化技术的发展&#xff0c;信息化系统集成度越来越高。设备敏感度高&#xff0c;抗冲击能力低&#xff0c;极易受到电涌脉冲的危害。电涌保护器&#xff08;SPD&#xff09;作为专业的防电涌产品&#xff0c;应用越来越广&#xff0c;SPD的应用涉及很多的专业知识&#…

孩子创新思维秘籍

头脑风暴最重要的原则之一就七个字&#xff0c; 要数量&#xff0c;不要质量。 意思就是说&#xff0c;你尽可能的去胡思乱想&#xff0c;胡说八道&#xff0c;天马行空就对了。 我们从这一大堆古灵精怪的玩意儿里面去筛选那些真正有价值的东西&#xff0c;可以拓展的方案。 然…

【技术选型】Redis的几种集群方案、及优缺点对比

文章目录 背景一、主从模式二、哨兵模式三、Redis Cluster四、各大厂的Redis集群方案客户端分片代理分片Codis 五、Redis集群方案解决方案六、Redis集群方案原理总结 背景 在服务开发中&#xff0c;单机都会存在单点故障的问题&#xff0c;及服务部署在一台服务器上&#xff0…

GCP学习笔记(二)——大数据和机器学习

文章目录 一、数据读取和处理1.Pub/Sub代码实践PublishingSubscribing 2. Dataflow使用Python搭建Pipeline 3. Dataproc4. Cloud Data Fusion5. 其他工具Cloud Composer &#xff08;Apache Airflow&#xff09;Cloud Scheduler 二、可视化与分析1. Looker2. Looker Studio3. B…

【数据结构与算法C++实现】2、二分查找与简单递归

原视频为左程云的B站教学 文章目录 1 二分法1.1 在有序数组中查找特定元素1.2 在一个有序数组中查找>某个数的最左侧的位置1.3 在一个有序数组中查找<某个数最右侧位置1.4 局部最小值问题&#xff08;无序数组使用二分法的案例&#xff09; 2 简单的递归思想 1 二分法 …