[原创][第I部分][编程基础]我的C++ 98复习并升级到C++20的复习旅途

[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
最近在努力地学习C++20的相关知识点, 给自己订下一个小目标: 把自身已掌握的陈旧C++98, C++03逐步升级到C++20. 以适应现代C++开发的要求. 在学习和复习的过程中, 顺便记录疑惑点. 该复习过程会经历现代C++开发5大理论的学习. 当前已经完成了[第I部分][编程基础]的学习任务. 下一个阶段会进入[第II部分]的学习.

[第I部分][编程基础][总结列表, 有些细节, 会配备相应的代码来解释]

1> 基础类型变量初始化

int total{0} ;

2> 基础类型之间的显示转换

double average{static_cast<double>(total) / gradeCounter} ;


语法解释: 使用static_cast进行强制显示转换, 把int类型提升至double.
表达式作用: 把total的临时double拷贝除以int类型的gradeCounter.

3> 格式化浮点数

std::cout << setprecision(2) << fixed << L"Class average is " << average << L"\n" ;


表达式作用: setprecision(2)将浮点数的精度设置为两位小数, 默认四舍五入. fixed强制浮点数不能使用科学记数法格式显示. fixed也可以强制打印小数点和尾随的零. 例如:88.00.

4> 数字分隔符

long long value1{9'223'372'036'854'775'807LL} ; // max long long vaule


语法解释: 为了增强字面值的可读性, 并减少打字错误, C++14引入数字分隔 ' (单引号字符). 另外LL表示字面值指定为long long整数.

5> swtich case break的"直通"行为: [[fallthrough]]特性

6> C++ 20新型格式化

std::cout << format("{}'s grade is {}\n", student, grade) ;


表达式作用: 可以使用{}大括号了进行格式化.

7> 短路求值
语法解释: 使用了&&或||操作符的组合表达式如果提前知道结果, 那么会立即停止求值.
例子:

(gender == FEMALE) && (age >= 65)


如果gender不等于FEMALE, 那么整个组合表达式必定为假, 所以会立即停止求值, 不会继续求值age >= 65.

8> C++11开始大量引入新的数学函数

9> 配合"准则支持库"的收缩转换: narrow_cast

gsl::narrow_cast<int>(7.5)


语法解释: 将double值7.5转换为int值7

10> C++11提供更安全的随机数功能库

11> enum class

12> C++11指定枚举常量的类型

enum class Status : short {keepRolling, won, lost}


语法解释: 将enum class Status中的常量类型指定为short类型

13> 块作用域
在嵌套块中, 如果外层块中的标识符与内层块中的标识符同名, 那么外层块中的标识符将被"隐藏", 直到内层块结束. 内层块"看到"的是自己的局部变量的值, 而不是包围它的那个块的同名变量值. 如果不小心为内层块中的标识符使用了和外层块的标识符相同的名称,  而事实上你想让外层块中的标识符延续到内层块, 那么通常都是一个逻辑错误. 

[原创]C++98升级到C++20的复习旅途-“作用域规则“-CSDN博客

14> 内联函数(inline function)
作用: 从软件工程的角度来说, 将程序作为一组函数来实现是不错的. 但函数调用涉及执行时间和资源的开销. C++提供了"内联函数"(inline function)来帮助减少函数调用的开销. 在函数定义的返回类型前附加一个inline关键字, 即可让编译器在调用该函数的每个地方都生成函数主体代码的一份拷贝(如果可以的话), 从而避免函数调用. 这通常会使程序变大. 编译器有可能会忽略inline的限定符.  另外编译器可能会自动内联你没有显示添加inline的代码. 但"C++核心准则"指出, 只应对"小的, 对执行时间要求高"的函数进行内联.

15> 引用, 引用参数, const引用
作用: 如果传递的是对变量的引用, 调用者相当于允许被调用者的函数直接访问在调用者中的这个变量, 而且允许对方修改该变量. 传引用有利于性能, 因其可以避免传值时对大量数据进行拷贝的开销.

int& number; 
viod displayName(const std::string& name);


语法解释: "number是对一个int的引用" "name参数是对一个string的引用, 该引用是常量. 被调用者不能修改调用者的值"

16> 默认参数
注意事项: 默认参数必须是函数参数列表最右边(靠近尾部)的参数. 调用具有两个或者多个默认参数的函数时, 如果一个被省略的实参不是最右边的那个, 该实参右边的所有实参也必须是省略的.

int boxVolume(int length=1, int width=1, int height=1); //合法
int boxVolume(int length, int width, int height=1); //合法
int boxVolume(int length=1, int width, int height); //非法
int boxVolume(int length=1, int width, int height=1);//非法
int boxVolume(int length=1, int width, int height);//非法

17> 一元作用域解析操作符(unary scope resolution operator), 即 ::
作用: 如果当前作用域有一个和全局变量同名的局部变量, 就可以使用该操作符访问变量的全局版本. 

#include <iostream>
#include <locale>const int number{7} ;int _tmain(int argc, _TCHAR* argv[])
{// 让控制台程序支持显示中文std::locale::global(std::locale("")) ;const double number{10.5} ;std::wcout << L"局部double number变量: " << number << std::endl;std::wcout << L"全局int number变量: " << ::number << std::endl;}

18> 函数重载
注意事项: 同一个参数列表, 不同的返回类型, 像这样创建重载函数也会造成编译错误. 编译器只根据参数列表来区分重载函数. 重载函数不需要有相同数量的参数. 另外有默认参数的函数在调用时可能与另一个重载函数发生冲突; 这也会造成编译器错误. 例如: 假定程序中有一个函数显示地不获取任何实参, 另一个同名函数则全部包含默认参数, 那么一旦调用这个名字函数, 同时不传递任何实参,  两者就会产生歧义, 因为编译器无法判断应该调用函数的哪个版本.

19> 函数模板. 模板编程也叫泛型编程
注意事项: "函数模板"其实是源于"函数重载"的思想, 说白了"函数模板"就是针对参数类型重载, 在函数的参数列表用中 所有参数的类型都用一个简单的字符代替了. 比如用 T 这个字母就可以代替所有类型int, double, char 等等. 

[原创]C++98升级到C++20的复习旅途-“函数模板“-CSDN博客

20> 操作数的求值顺序
注意事项: 从C++17开始, 还为其他多种操作符规定了操作数的求值顺序. 比如 [],->, (), <<, >>, .*和->*操作符, 编译器都会从左到右求值操作数.

[结尾]
这份列表, 不合适零基础的C++学习者, 仅仅合适有基础的读者阅读, 方便这类有基础的读者有一个快熟的总结. 

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

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

相关文章

python激活python38

py38是我建立的anaconda下的一个python3.8环境。 命令行里使用conda activate py38会出现&#xff1a; conda activate error: argument COMMAND: invalid choice 因为condat已经移除了该命令。 执行 activate py38没报错&#xff0c;但是没有转换到py38环境。 使用 sour…

Spring源码解读之创建bean

本文章我们会解读一下Spring如何根据beanDefinition创建bean的&#xff1b; 代码入口&#xff1a; AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);applicationContext.refresh(); 当spring执行refresh(…

关于ai大模型是否开源的讨论

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

人工智能学习1

一.人工智能概述 1.AI的基础学科包括&#xff1a;数学&#xff08;离散、模糊&#xff09;、思维科学&#xff08;认知心理、逻辑思维学、形象思维学&#xff09;和计算机&#xff08;硬件、软件&#xff09;等。 2.新一代人工智能呈现出“深度学习、跨界融合、人机协同、群智…

Jmeter+influxdb+grafana监控平台在windows环境的搭建

原理&#xff1a;Jmeter采集的数据存储在infuxdb数据库中&#xff0c;grafana将数据库中的数据在界面上进行展示 一、grafana下载安装 Download Grafana | Grafana Labs 直接选择zip包下载&#xff0c;下载后解压即可&#xff0c;我之前下载过比较老的版本&#xff0c;这里就…

单机多卡训练

参考几个不错的帖子&#xff08;还没来得及整理&#xff09;&#xff1a; 基于pytorch多GPU单机多卡训练实践_多卡训练效果不如单卡-CSDN博客 关于PyTorch单机多卡训练_能用torch.device()实现多卡训练吗-CSDN博客 Pytorch多机多卡分布式训练 - 知乎 (zhihu.com) 当代研究生…

在 The Sandbox 设置总部,SCB 10X 和 T-POP 为 4EVE 元宇宙音乐会揭幕

协作学习为全球粉丝提供了无限的可能性&#xff0c;让他们通过革命性的元宇宙体验沉浸在泰国流行文化中。 作为 SCBX 集团背后的创新力量&#xff0c;SCB 10X 很高兴宣布与 T-POP Incorporation 展开开创性合作&#xff0c;T-POP Incorporation 是泰国流行文化在全球舞台上的领…

【算法】快速选择算法

目录 1.概述2.代码实现2.1.基于简单交换排序2.2.基于堆排序2.3.基于快速排序 3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;快速选择算法 (Quick Select Algorithm) 是一种用于在无序数组中寻找第 k 小&#xff08;…

鸿蒙开发已成新趋势

随着华为鸿蒙操作系统的快速崭露头角&#xff0c;鸿蒙开发已然成为当前技术领域的热门新趋势。本文将深入探讨鸿蒙开发的重要性和独特优势&#xff0c;并详细介绍一些关键的鸿蒙开发技术和工具&#xff0c;以及它们对开发者个人和整个行业带来的深远影响。 首先&#xff0c;鸿蒙…

入侵redis之准备---VMware安装部署kail镜像服务器【详细包含云盘镜像】

入侵redis之准备—VMware安装部署kail镜像服务器【详细包含云盘镜像】 kail是一个很好玩的操作系统&#xff0c;不多说了哈 下载kail镜像 kail官网:https://www.kali.org/get-kali/#kali-platforms 百度云盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PRjo…

django框架ORM

1、安装mysqlclient pip install mysqlclient2、创建文件models.py from django.db import modelsclass UserInfo(models.Model):name models.CharField(max_length32)password models.CharField(max_length64)age models.IntegerField(3)3、再settings中注册app INSTALLE…

具身智能17篇创新性论文及代码合集,2023最新

今天来聊聊人工智能领域近期的一个热门研究方向——具身智能。 具身智能&#xff08;Embodied Intelligence&#xff09;指的是机器人或智能体通过感知、理解和交互来适应环境&#xff0c;并执行任务的能力。与传统的基于规则或符号的人工智能不同&#xff0c;具身智能强调将感…

基于springboot实现私人健身与教练预约管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现私人健身与教练预约管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应…

克服海外邮件收发难题,Coremail提供全方位解决方案

客户背景 某3C电子企业成立于2007年&#xff0c;总部位于深圳&#xff0c;公司在国内多个重点城市均设有研发和生产基地。作为一家规模庞大、技术领先的国家高新技术企业&#xff0c;该企业始终致力于锂离子电池的研究与发展&#xff0c;为新能源行业提供专业、系统的材料解决…

hello vtk 圆柱

VTK 可视化的流程及步骤 标题引入VTK库和初始化&#xff1a; 引入 VTK 库和 AutoInit 模块&#xff0c;以便使用 VTK 的渲染和交互功能 设置背景颜色和颜色对象&#xff1a; 使用 vtkNamedColors 设置背景颜色和演员颜色。 创建圆柱体源&#xff1a; 使用 vtkCylinderSou…

蓝桥杯-01简介

文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况&#xff08;一&#xff09;大赛背景和宗旨&#xff08;二&#xff09;大赛特色&#xff08;三&#xff09;大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器 文章目录 可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 …

CH02_交给子类

Template Method模式 组成模板的方法被定义在父类中&#xff0c;由于这些方法是抽象方法&#xff0c;所以只查看父类的代码是无法知道这些方法最终会进行何种具体处理的。唯一能知道的就是父类如何调用这些方法。 类图 说明 AbstractClass&#xff08;抽象类&#xff09; Abs…

vue项目中通过vuex管理数据

目录 1.前言&#xff1a; 2.vuex的基础用法&#xff1a; 1.构建与挂载vue 基础模板渲染 构建仓库 2.mutations的使用 1.介绍 ​编辑 2.案列&#xff1a; 3.传参 4.辅助函数mapMutations&#xff1a; 3.module分对象的写法 介绍 建立模块&#xff1a; 访问数据的方…

【VROC】看Intel VROC如何给NVMe SSD做RAID

在当今对硬盘性能要求越来越高的环境中&#xff0c;SATA和SAS接口由于自身的限制&#xff0c;其性能很难突破600MiB/s的瓶颈。因此&#xff0c;对于需要更高底层硬件性能的行业&#xff0c;如数据库等&#xff0c;对NVMe盘的需求越来越迫切。然而&#xff0c;NVMe盘直通到CPU&a…