网站首页 > 技术文章 正文
概述:C++过去和现在都是一种伟大的编程语言,无论我们是否意识到这一点,我们的许多日常数据库,脚本引擎和游戏主要是使用C++编写的,并且该语言将在不久的将来继续存在。C++ 的生态系统这意味着我们将不得不在不久的将来用 C++ 编写新代码,但我们有一个选择,即传统与现代 C++现代 C++ 随着时间的推移发展了很多,我们可以在不使用许多传统 C++ 结构的情况下编写代码,这些结构被认为是有问题的,也是较新的系统编程语言喜欢并存在的主要原因之一。GolangRust现代 C++ 头像随着 C++11(即 2011 年)而出现,从那时起,它每 3 年定期发布一次更新。C++ 的当前版本是 C++23。因
C++过去和现在都是一种伟大的编程语言,无论我们是否意识到这一点,我们的许多日常数据库,脚本引擎和游戏主要是使用C++编写的,并且该语言将在不久的将来继续存在。
C++ 的生态系统
这意味着我们将不得不在不久的将来用 C++ 编写新代码,但我们有一个选择,即传统与现代 C++
现代 C++ 随着时间的推移发展了很多,我们可以在不使用许多传统 C++ 结构的情况下编写代码,这些结构被认为是有问题的,也是较新的系统编程语言喜欢并存在的主要原因之一。GolangRust
现代 C++ 头像随着 C++11(即 2011 年)而出现,从那时起,它每 3 年定期发布一次更新。C++ 的当前版本是 C++23。
因此,以下是我们在编写新的现代 C++ 代码时不应该使用的一些内容。
这不是一个详尽的清单,但包含了一些我们必须避免的明显清单,除非另有绝对必要
C++ 向后兼容,此功能是有代价的
C++编译器向后兼容,这意味着新版本的编译器也可以编译C++的旧结构/代码,这意味着没有办法阻止软件开发人员使用C++之前的结构11。
为什么选择 C++11?因为这是使C++成为现代编程语言的第一步。
保持向后兼容性不是技术限制,它更多的是关于业务和支持的连续性。
在我看来,这是C++作为现代编程语言的发展和可接受性中最大的问题。
向后兼容性永远不会让 C++ 摆脱被认为不必要和有问题的包袱,即使我们可以没有它。
旧版 C++ 构造
这也阻止了新程序员选择C++,并且如果不了解和理解遗留功能和相关约束,就无法学习和使用现代C++。
但是,作为 C++ 程序员,我们可以确保我们不使用旧包袱并将它们视为不存在。
内存分配和取消分配
切勿使用 etc 来分配和解除分配内存new, delete, malloc, free
请改用智能指针,因为它会自动处理分配和释放,从而防止不必要的_内存使用_,更重要的是防止_内存泄漏。_unique_ptr<> , shared_ptr<>
虚拟继承
C++ 中曾经存在的最不必要的东西(在我个人看来)。一切,我再说一遍,我们想做的一切都可以在不使用虚拟继承的复杂性的情况下完成
虚拟继承用于处理我们所说的钻石继承依赖关系,如下图所示
虚拟继承 — Diamond 依赖关系
虚拟继承是一个很大的_禁忌_,不存在使用语言的正常结构或使用正常继承无法解决的问题。
在我看来,这种虚拟继承可能是事后才想到的,程序员以可重用性的名义创建未经检查的继承(实际上也不需要,组合在许多情况下也同样有效)。
操作员重载
C++对象不是数学结构,也不应该是。
在 C++ 中,运算符重载用于对对象应用数学运算。我们到底为什么要在物体上做?+, -, *, ||, &&
有一些内置的类型可以做到这一点,如果我们必须使用这样的东西,那么我们就是以错误的方式创建对象
有时可能有一个正当的理由来比较对象,以便它们可以用于排序等算法,但更好的方法是创建一个比较器函数来比较对象的特定数据。
请考虑这样一个事实,即运算符重载并不流行,而且其他面向对象编程语言中不允许出现许多情况。
它只是增加了简单问题的实现复杂性。
为了创建比较器,我们还可以在以下许多情况下使用 STL。
std::less<int> lessThan;
std::greater<int> greaterThan;
// <int> can be replaced with <user-defined_type>
// by creating a custom comparator comparator function
原始数组和指针
C++ 中的数组和指针
您永远不应该创建如下列表或数组
int array[5] = {1,2,3,4,5}
int dynamic_array = new int[5]
相反,您必须将 STL 数组用于静态数组和向量,将 duque、list 和 forward_list 用于动态数组
// Static Array
std::array<int, 5> stl_array = {1, 2, 3, 4, 5};
// Dynamic Array
vector<int> dv;
deque<int> dd;
list<int> dl;
forward_list<int> df;
现在可以使用指针来访问内存位置,以便我们可以访问内存位置的值
int value = 10;
int *ptr = &value;
*ptr = 100; // now value = 100
实际上,如果您有变量,则不需要使用指针来访问或更改变量的值。您可以直接处理变量,这将使您的代码干净。value
永远记住,如果你需要使用指针,那么你很有可能改进你的代码。考虑改用引用或任何其他机制。
使用其他机制(如引用)的另一个好处是,您需要减少对复制构造函数的考虑。
宏
停止使用宏向编译器提供指导。相反,请使用现代 C++ 的元编程结构。
以更好的方式组织代码,并使用 STL 之类的东西为编译器提供特定的方向const, constexpr, enum
我将在这里停止使用什么。清单上还有更多项目,但我希望您能了解其中的要点。
我将用我们应该和必须使用的东西来结束这篇博客,以利用 C++ 作为现代编程语言的最终好处,那就是 STL,即标准模板库。
STL(标准模板库)
您只需要 STL,即标准模板库即可创建软件。
STL 可以被认为是现代 C++ 的同义词,不需要使用类、继承、内存管理来实现所需的功能。
- 上一篇: C++ memcpy的用法,大数据传输与获取
- 下一篇: 精选 30 个 C++ 面试题(含解析)
猜你喜欢
- 2024-12-06 C++ memcpy的用法,大数据传输与获取
- 2024-12-06 C++中继承的详细介绍以及多态的使用场景
- 2024-12-06 C++“智能指针”并不智能,因为它也不总是知道内存是如何分配的
- 2024-12-06 C++11精要学习:右值引用与完美转发
- 2024-12-06 C/C++编程笔记:详细讲解丨复制构造函数
- 2024-12-06 C++ map用法总结
- 2024-12-06 C#与C++交互开发系列(四):使用C++/CLI进行互操作
- 2024-12-06 C++的map用法
- 2024-12-06 C++基础语法梳理:内存分配和管理
- 2024-12-06 2021 秋招 100 道 C++ 面试高频题汇总
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)