【从零开始学习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++的使用,因此我们要对这十个新增特性足够熟悉。
相关文章:

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)
目录 前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结: 前言: C的学习难度大,内容繁多。因此我们要及时掌握C的各种特性,因此我们更新本篇文章,向…...

你真的会用async和await么?
背景 背景就是遇到了一个比较烦人的模块,里面的涉及到了大量的async 和 awiat。发现大多人对这个语法糖一知半解,然后大量的滥用,整理一下 async 前置知识: Promise.resolve(foo) new Promise(resolve > resolve(foo)…...

vscode远程连接提示:过程试图写入的管道不存在(删除C:\Users\<用户名>\.ssh\known_hosts然后重新连接)
文章目录 复现过程原因解决方法总结 复现过程 我是在windows上用vscode远程连接到我的ubuntu虚拟机上,后来我的虚拟机出了点问题,我把它回退了,然后再连接就出现了这个问题 原因 本地的known_hosts文件记录服务器信息与现服务器的信息冲突了…...

【005】基于深度学习的图像语 通信系统
摘要 语义通信是一种新颖的通信方式,可通过传输数据的语义信息提高带宽效率。提出一种用于无线图像传输的系统。该系统基于深度学习技术开发并以端到端(E2E)的方式进行训练。利用深度学习实现语义特征的提取和重建,在发送端提取信…...

基于ssm的社区生活超市的设计与实现
博主介绍:专注于Java技术领域和毕业项目实战。专注于计算机毕设开发、定制、文档编写指导等,对软件开发具有浓厚的兴趣,工作之余喜欢钻研技术,关注IT技术的发展趋势,感谢大家的关注与支持。 技术交流和部署相关看文章…...

长短期记忆网络(LSTM)原理解析
长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种常用于处理序列数据的深度学习模型。它在循环神经网络(Recurrent Neural Network,RNN)的基础上进行了改进,旨在解决传统RNN中的梯度消失…...

vscode debug的方式
在.vscode文件夹下建立launch.json 例子1:调试python 来自 https://github.com/chunleili/tiPBD/tree/amg {"version": "0.2.0","configurations": [{"name": "hpbd 5 5","type": "python&quo…...

微信加粉计数器后台开发
后台包括管理后台与代理后台两部分 管理后台 管理后台自带网络验证卡密系统,一个后台可以完成对Pc端的全部对接,可以自定义修改分组名称 分享等等代理后台 分享页 调用示例 <?php$request new HttpRequest(); $request->setUrl(http://xxxxxxx/api); $request->…...

黑客是什么?想成为黑客需要学习什么?
什么是黑客 在《黑客辞典》里有不少关于“黑客”的定义, 大多和“精于技术”或“乐于解决问题并超越极限”之类的形容相关。然而,若你想知道如何成为一名黑客,只要牢记两点即可。 这是一个社区和一种共享文化,可追溯到那群数十年前使…...
iOS中__attribute__的使用
通过__attribute编译期指令将数据注册至Mach-O指定段的section,可以提供更灵活的注册方式,避免了非必要依赖。通过这种方式不仅仅能够在任何地方注册string,甚至可以注册C函数。 下面的库提供了注册和读取内容的简单方式,主要支持…...

腾讯、飞书等在线表格自动化编辑--python
编辑在线表格 一 目的二 实现效果三 实现过程简介1、本地操作表格之后进入导入在线文档2、直接操作在线文档 四 实现步骤讲解1、实现方法的选择2、导入类库3、设置浏览器代理直接操作已打开浏览器4、在线文档登录5、在线文档表格数据操作6、行数不够自动添加行数 五 代码实现小…...
开源库nlohmann json使用备忘
nlohmann/json是一个用于解析JSON的开源C库,口碑一流,无需额外安装其他第三方库,还支持单个头文件模式,使用起来非常方便直观。 1. 编译 从官网https://github.com/nlohmann/json的Release页面下载单个json.hpp即可直接使用&…...
语音识别开源框架 openAI-whisper
Whisper 是一种通用的语音识别模型。 它是OpenAI于2022年9月份开源的在各种音频的大型数据集上训练的语音识别模型,也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 GitHub - yeyupiaoling/Whisper-Finetune: 微调Whisper语音识别模型和加速推理…...
php做的中秋博饼游戏之绘制骰子图案功能示例
先看代码 header(Content-Type:image/png); $img imagecreatetruecolor(200, 200); $white imagecolorallocate($img, 255, 255, 255); $grey imagecolorallocate($img, 100, 100, 100); $blue imagecolorallocate($img, 0, 102, 255); $red imagecolorallocate($img, …...
erlang 虚拟机优化参数
sbwt none 将CPU忙等待关闭将有助于降低系统显示的CPU使用率,因为开启了忙等待的BEAM,CPU负载并不代表真实的工作情况; K true 开启epoll IO模型 swt low Sets scheduler wakeup threshold. Defaults to medium. The thresh…...

网络安全能力成熟度模型介绍
一、概述 经过多年网络安全工作,一直缺乏网络安全的整体视角,网络安全的全貌到底是什么,一直挺迷惑的。目前网络安全的分类和厂家非常多,而且每年还会冒出来不少新的产品。但这些产品感觉还是像盲人摸象,只看到网络安…...
python爬虫试手
同事让帮忙在某个网站爬点数据,首次尝试爬虫,遇到的问题及解决思路记录下。 大体需求是需要爬取详情页内的信息,详情页有一定格式规律,但是详情页需要从列表页跳入,列表页中的每一条记录需要鼠标悬停才会弹出跳转链接…...

pandas 笔记:pivot_table 数据透视表
1 基本使用方法 pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)2 主要参数 dataDataFramevalues要进行聚合的列index在数据透视表索引(index…...

C#(六十)之Convert类 和 Parse方法的区别
Convert数据类型转换类,从接触C#开始,就一直在用,这篇日志坐下深入的了解。 Convert类常用的类型转换方法 方法 说明 Convert.ToInt32() 转换为整型(int) Convert.ToChar() 转换为字符型(char) Convert.ToString() 转换为字符串型(st…...

暑期代码每日一练Day3:874. 模拟行走机器人
题目 874. 模拟行走机器人 分析 这道题就是个简单的模拟 主要有两点考察点: 对方向数组的运用 方向数组存储的是各个方向的单位向量,也即: 方向XY向北01向东10向南0-1向西-10 存储在数组中,则是方向数组: in…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...