什么是现代C++?

Kno*_*tle 27 c++

我有时会阅读关于为什么C++好或坏的讨论,有时其中一个论点引用了今天的现代C++与旧的C++非常不同.我想知道到底有什么区别?什么是"现代"C++的例子,以及这个"旧"C++的例子(最好做同样的事情)是什么?

Mar*_*ett 27

广泛使用标准库和STL,异常和模板 - 而不仅仅是C与类

  • 我也将RAII添加到列表中. (6认同)
  • @ A-ha,STL通常用作非正式方式来引用标准库的"新"部分. (2认同)

Mic*_*fik 25

"现代"C++不怕使用以下任何一个或全部:

  • RAII
  • 标准库容器和算法
  • 模板
  • 元编程
  • 例外
  • 促进

由于缺乏编译器支持或运行时性能,"旧"C++倾向于避免这些事情.相反,你会发现......

  • 很多newdelete
  • 滚动自己的链表和其他数据结构
  • 返回代码作为错误处理的机制
  • 数百万个自定义字符串类中的一个 std::string

正如所有这些与那些论点一样,这两种方法都有其优点.现代C++并不是普遍的好.例如,嵌入式环境通常需要大多数人永远不需要的额外限制,因此您将看到许多旧式代码.总的来说,我认为你会发现大多数现代功能都值得定期使用.摩尔定律和编译器的改进已经解决了大多数避免新东西的原因.

  • 我认为他这样做是为了震撼:)但是异常会引入代码中的跳转,这使得难以遵循执行路径,特别是因为那些是隐藏的跳转.如果保留到真正特殊的条件,那么无关紧要,但如果任何调用的操作符可能会失败,那么您将陷入一个受伤的世界(维护方面).我已经决定(最近)尽可能尝试无异常编程.毕竟,"find"方法不能找到结果是正常的. (2认同)

Nem*_*vic 11

一个非常明显的区别是,在"旧式"C++中,您将看到许多手动创建new和销毁的对象delete.在现代C++中,只要有可能就在堆栈上创建一个对象,或者至少包含在某种智能指针中.

另一个区别是旧式C++更多地关注OOP,而现代C++使用混合编程风格:过程,模块,对象和泛型.自由函数在现代C++中被认为是一件好事,而在旧式C++中它们会被推到某个类中.

其他明显的差异包括使用构造和库变得成熟和稳定,足以用于生产代码:模板,异常,命名空间,STL等.

  • +1我们的主要产品中没有一个`删除'. (6认同)

Mat*_* M. 8

C++中有许多被认为是现代的东西.

首先,我认为,模板是非凡的出现.不仅是STL本身,而且模板的"常规"使用也导致了模板元编程的发展.例如,注意enable_if即将出现的标准版本.

这是我认为C++程序员寻求通过构造强制执行正确性的运动中最显着的特征:

  • 更喜欢编译器错误到运行时错误>模板/类型安全而不是省略号/ void*
  • 使用范围限制资源管理(又名RAII,但更明确一点)

这项高质量的研究也导致了普遍使用:

  • STL(已经过全面测试的算法和数据结构,即使STL在设计中很不安全)
  • Boost库(由专业程序员审核,准无bug,高度可移植)

回顾这些库还表明,C++程序员不再具有对这些OO语言的自卑感:现在从这个复杂的语言中解脱出来,我们毫不犹豫地混合各种范式(OO,泛型,程序)来实现我们的目标.

总而言之,我认为Modern C++更像是一种心态.我们(C++程序员)试图摆脱困扰我们这么久的可怕的未定义行为,并试图释放我们的用户(通过定义不允许它的接口).我们也接受其他人来过的事实,重用现有的图书馆并不是软弱的表现.