我有时会读一些关于C ++好坏的讨论,有时一个论点是今天的现代C ++与旧的C ++非常不同。我想知道具体的区别是什么?什么是“现代”C ++的例子,以及这个“旧”的C ++的例子(最好做相同的事情)是什么?
我有时会读一些关于C ++好坏的讨论,有时一个论点是今天的现代C ++与旧的C ++非常不同。我想知道具体的区别是什么?什么是“现代”C ++的例子,以及这个“旧”的C ++的例子(最好做相同的事情)是什么?
广泛使用标准库和STL,异常处理和模板——而不仅仅是C++中的类
"现代化"的C++ 不害怕使用以下任何一个或全部:
"旧式"的C++ 由于认为缺乏编译器支持或运行时性能不佳,往往避免使用这些东西。相反,你会发现...
new
和 delete
std::string
与所有的“这个 vs 那个”的争议一样,这两种方法都有其优点。现代化的C++并不是普遍更好。例如,在嵌入式环境中,通常需要额外的限制,大多数人从未需要过,因此你会在那里看到很多旧式代码。然而总体而言,我认为你会发现大多数现代特性值得经常使用。摩尔定律和编译器的改进已经解决了大部分避免使用新功能的原因。
一个非常明显的区别是,在“旧式”C++中,你会看到许多对象手动使用new
创建,使用delete
销毁。在现代C++中,只要可能,对象就会在堆栈上创建,或者至少被包装在某种智能指针中。
另一个区别是,旧式C++更注重OOP,而现代C++使用混合编程风格:过程化、模块化、面向对象和泛型。自由函数在现代C++中被认为是一件好事,而在旧式C++中它们将被塞入某个类中。
其他明显的区别包括使用已经成熟稳定且可用于生产代码的构造和库:模板、异常、命名空间、STL等。
C++ 中有很多被视为“现代”的东西。
首先,我认为最令人惊异的是模板的出现。不仅是 STL 本身,还包括一些不太“规则”的模板使用,这些使用导致了模板元编程的发展。例如,在即将发布的标准中就可以看到 enable_if
的存在。
我认为这是一种追求通过构造来强制正确性的 C++ 程序员运动中最显著的特点:
void*
这种高质量的研究也导致了普遍使用以下内容:
对这些库的评估还证明了 C++ 程序员不再对那些面向对象语言有自卑感:现在我们从这种情况中解放出来,毫不犹豫地混合使用各种范式(面向对象、泛型、过程式)来实现我们的目标。
总的来说,我认为现代 C++ 更多的是一种心态。我们(C++ 程序员)试图摆脱那些长期以来困扰着我们的可怕的未定义行为,并试图让用户也避免这种情况(通过定义不允许出现这种情况的接口)。我们还接受了别人已经先行一步的事实,并且重新利用现有的库并不意味着软弱。