概述: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 lessThan;
std::greater greaterThan;
// can be replaced with
// 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 stl_array = {1, 2, 3, 4, 5};
// Dynamic Array
vector dv;
deque dd;
list dl;
forward_list df;
现在可以使用指针来访问内存位置,以便我们可以访问内存位置的值
int value = 10;
int *ptr = &value;
*ptr = 100; // now value = 100
实际上,如果您有变量,则不需要使用指针来访问或更改变量的值。您可以直接处理变量,这将使您的代码干净。value
永远记住,如果你需要使用指针,那么你很有可能改进你的代码。考虑改用引用或任何其他机制。
使用其他机制(如引用)的另一个好处是,您需要减少对复制构造函数的考虑。
宏
停止使用宏向编译器提供指导。相反,请使用现代 C++ 的元编程结构。
以更好的方式组织代码,并使用 STL 之类的东西为编译器提供特定的方向const, constexpr, enum
我将在这里停止使用什么。清单上还有更多项目,但我希望您能了解其中的要点。
我将用我们应该和必须使用的东西来结束这篇博客,以利用 C++ 作为现代编程语言的最终好处,那就是 STL,即标准模板库。
STL(标准模板库)
您只需要 STL,即标准模板库即可创建软件。
STL 可以被认为是现代 C++ 的同义词,不需要使用类、继承、内存管理来实现所需的功能。