2024年C++编程不再推荐使用的功能你还在在用吗?

作者:微信公众号:【架构师老卢】
4-29 7:33
48

概述: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++ 的同义词,不需要使用类、继承、内存管理来实现所需的功能。

阅读排行