现代 C + + 正变得越来越流行吗?

当我6-7年前第一次学习 C + + 的时候,我学到的基本上就是“带有类的 C”。std::vector绝对是一个高级的话题,如果你想学的话,你可以学到一些东西。当然,也没有人告诉我,可以利用析构器来帮助管理内存。 今天,我看到的所有地方都是 RAII、 SFINAE、 STL、 Boost,以及现代 C + + 。甚至那些刚刚开始学习这门语言的人似乎从第一天起就被教授这些概念。

我的问题是,这仅仅是因为我只看到了“最好的”,也就是说,这里的问题在 SO,在其他的编程网站,往往吸引初学者(gamedev.net) ,或者这实际上是代表 C + + 社区作为一个整体?

现代的 C + + 真的成为默认的了吗?它不是专家们所写的那些花哨的东西,而是正在变成“ C + + 的样子”吗? 或者我只是不能看到成千上万的人仍然学习“ C 与类”,编写自己的动态数组而不是使用 std::vector,并通过手动调用 new/delete 从他们的顶级代码进行内存管理?

尽管我很想相信,但是如果 C + + 社区作为一个整体在短短几年内就发生了如此大的变化,这似乎令人难以置信。 你的经历和印象是什么?

(免责声明: 不熟悉 C + + 的人可能会将标题误解为询问 C + + 是否比其他语言更受欢迎。这不是我的问题。“现代 C + +”是 C + + 中一种方言或编程风格的通用名称,以“ 现代 c + + 设计: 泛型和设计模式的应用”一书命名,我只对这个和“旧 C + +”的区别感兴趣。所以不需要告诉我 C + + 的时代已经过去了,我们都应该使用 Python;)

34970 次浏览

学习 C + + 的最佳书籍。Koenig & Moo 的“加速 C + +”教会了你所说的现代 C + + ,所以我猜现在大多数人都在使用它。对于我们这些已经使用 C + + 相当长时间的人(以我为例,从80年代中期开始)来说,现代的 C + + 是对编写我们自己的数组、字符串、哈希表(令人作呕地重复)这些乏味任务的极大缓解。

完全同意。对我来说,如果你不用你所谓的“现代 C + +”风格来编程 C + + ,那么使用 C + + 就没有意义了!你也可以直接使用 C。“现代 C + +”应该是我认为 C + + 编程的唯一方式,我希望每一个使用 C + + 并以这种“现代”方式编程的人都会同意我的观点。事实上,当我听说一个 C + + 程序员不知道 auto _ ptr 或 ptr _ Vector 之类的东西时,我总是感到非常震惊。就我而言,这些想法对于 C + + 来说是基本的和基本的,所以我不能用其他的方式去想象。

我觉得你刚开始的时候经历了不好的事情。

你需要给自己买 Scott Meyers有效的 C + + 书籍。我在1999年愤怒地开始学习 C + + ,我的团队领导让我坐下来阅读有效的 C + + 和更有效的 C + + ,然后才允许我检入任何代码。

他的大部分建议是这样的“不要使用这个 特写,但如果你必须,记住 这个

如果你听从他的建议,你会写出好的或“现代”的 C + + 。

他现在也有一本关于 STL 的书,但是我还没有读过。

我不会说 std: : Vector 现在有资格称为“现代”,它真的很基本。

一般来说,我的印象是,人们已经获得了一些现代 C + + 风格的经验,并清醒了一点。举个简单的例子,STL for _ each 很有趣,但实际上它并没有给普通的 C 循环增加太多的价值。它更难调试,有时不能提供最佳性能。而且,当前 STL 中的函数式编程结构通常非常繁琐,特别是如果您从像 ML 这样的真正的函数式语言中获得经验的话。

我是这些家伙之一,谁学会了如何与 STL 的工作,并听到了很多关于 RAII 和良好的 C + + 编程实践从第一天。看起来现在一些最受推荐的学习 C + + 的书籍(比如《加速 C + + 》和《有效 C + + 》系列)关注的是如何使用 STL 工具而不是卷起你自己的东西,同时也给出了很多关于有效(或“现代”)编程的“规则”。

但与朋友交谈时,我也注意到一些公司仍然使用“ C with Class”,而不是“ Modern C + +”。也许“现代 C + +”的作者和用户提出的文化将来会流行起来:)

在 Windows 3.1时代,C 是标准。当 C + + 进入开发者市场,后来成为 ANSI 标准时,它成为了新的热点。它使用多态性推广了 OOP 缩写和一些基本的设计模式。

现在,随着对低门槛入口管理平台(如 C #/)的更广泛接受。NET,那么使用 C + + 的理由就更少了。很多开发人员都有选择的余地,说实话: C + + 对于新手来说是一个很难学的东西。使用 C # ,您可以直接运行它。

这实际上只留下了需要 C + + 的平台和顽固的 C + + 传道者来继续实践这门艺术。这是一个需要并且想要所有被认为是“现代 C + +”的抽象层的社区。

所以,是的,我相信“现代 C + +”,正如你所说的,正变得越来越普遍。尽管如此,与过去相比,它在不同的受众中流行起来。

20世纪90年代后期语言的标准化是第一步,它允许编译器制造者专注于“标准”特性集,也允许语言修复一些粗糙的边缘,这些边缘出现在标准化过程中。

这反过来又允许基于语言的标准特性开发框架,而不是基于特定编译器实现提供的特性。Boost 库在这方面表现得尤为突出。这也允许新的发展是基于以前的工作,从而使可能的解决方案,更复杂的问题。

这里一个值得注意的变化是,以前的框架是如何基于基类和派生类(运行时特性)的概念的。但是现在大多数高级特性通常主要基于“递归”模板(编译时特性)。

STL 有它的优点和缺点,但它经受住了时间的考验,如果你想要一些工作,是简单的 STL 肯定有东西帮助你开始。重造轮子是没有意义的(除非出于说教的原因)。

计算机硬件也从20世纪90年代起有了很大的飞跃,那时内存和 CPU 不再是编译器的限制。因此,从书中得到的大多数理论优化现在都是可能的。

该语言的下一步是支持多核编程,这是标准工作的一部分。

根据我的经验(西班牙大学) ,不幸的是,规范是不考虑语言本身。他们使用最简单的语言来教授编程(比如 Java) ,因为它对于老师和学生来说应该很简单,然后他们在操作系统课程中使用 C 语言。

C + + 的介绍非常少(无论如何在任何课程中) ,只是为了给 C 提供类。他们不进入助推器,甚至 STL。我认为保持 C + + 的所有特点和思维方式对教师和学生来说都是昂贵的。这里有多少 C + + 程序员对所有 Boost 库有足够的了解,可以使用它们来提供更好的解决方案或进行设计?一个人必须有兴趣跟上所有新的图书馆和习语。

然而,正如我所说,似乎一般的编程(特别是编程语言)并没有得到太多重视,因为当他们开始一项工作,然后忘记如何编程,因为他们在企业树。这里的许多企业,以及大学本身,都觉得编程可以由任何人完成。

如果你遵循这种哲学,那么对于我认识的大多数人来说,C + + 将永远是“带有类的 C”。

问候,

我觉得事情是这样发展的。

第一代 C + + 程序员是 C 程序员,他们实际上将 C + + 作为 C 用于类。另外,STL 还没有到位,所以这就是 C + + 的本质。

当 STL 出现的时候,这些东西变得更先进了,但是大多数人写书,整合课程,教授课程,首先学习了 C 语言,然后是额外的 C + + 的东西,所以第二代人从这个角度学习。正如另一个答案所指出的那样,如果你喜欢编写常规 for 循环,那么改用 std::for_each并不能给你带来多少好处,除了让你感到你在用“现代”的方式做事情。

现在,我们的教师和书籍作者已经使用了整个 C + + ,并且从这个角度得到了他们的指导,比如 Koenig & Moo 的加速 C + + 和 Stroustrup 的新教材。所以我们不学 char*然后 std::strings

这是一个有趣的教训,告诉我们“遗留”方法需要多长时间才能被取代,特别是当它们有效的跟踪记录时。

根据我的经验,这很大程度上取决于软件产品/项目的时代。我所知道的大多数新项目都使用现代 C + + (RAII,STL,Boost)。然而,有许多 C + + 项目已经有10年以上的历史了,你在那里看不到现代的 C + + 。

另外,请记住,一些最流行的 STL 实现直到5年前才几乎完全崩溃(MSVC < 7.0和 GNU < 3.00)

在我的 C + + 工作中,我发现现代功能越来越多地被使用,越来越多的人在电话筛选和面试中向我询问这些功能。据我所知,他们开始流行了。

我最初学习 C + + 的时候,就像学习 C 和类一样; 尽管这门语言已经远远超过了 C,但是我读过的书和和我一起工作的人们都坚定地停留在“旧 C + +”上。RAII 是人们会思考的东西,而不是自动做的,我记得读过一些关于异常安全问题的早期文章。

正如所指出的,现在有新书出版。许多旧的观点仍然有意义,但它们似乎越来越充分地解释了为什么明显的坏主意是坏的。(同样,现代读者也很难理解弗洛伊德关于潜意识的思想是多么具有革命性,因为它现在已成为传统智慧。)

Stroustrup 刚出了一本课本 编程: 使用 C + + 的原则和实践。我买它是因为我还没有从 Stroustrup 的书中学到好东西,但是还没有通过前几章。到目前为止,我所能说的就是我赞同他开始的方式,至少这是一个很好的介绍 C + + 应该如何使用。

在我目前参与的这个项目中,有很多 C + + 代码经过了相当长的一段时间(现在已经超过10年了)的发展。你所说的进化在这里是显而易见的: 旧代码通常是“ C with class”——原始指针、 char*字符串和使用相关的 C 函数、数组等; 新代码使用 ATL 智能指针等来管理资源,但大多数时候仍然坚持手工编码的循环,迭代器是一个罕见的景象; 最新的代码充满了 STL 容器、算法、 shared_ptr(包括用来管理句柄的自定义删除器等)、大量泛化的函数和类模板,等等。大多数传统的“带类的 C”编码技术,例如带有手动生命周期管理的原始未封装指针,在当今的代码审查中非常不受欢迎。从这一点来看,你的观察似乎是准确的。

最近的发展似乎是 C + + 0x lambdas 的时尚——它有积极的一面,因为它也倾向于使用标准算法而不是手工编码的循环,因为现在你可以让你所有的代码与算法内联。

我加入过的许多团队都会考虑这样一个大问题: “我们使用异常吗?”有个问题。这是“我们正在使用现代 C + + 吗?”的代码

一旦不使用异常,就不能使用该语言及其库的全部功能。

但是许多较老的代码库没有异常,而且人们认为很难将异常硬塞进一个不期望它们的代码库,或者塞进一个不知道如何使用它们的团队,所以在这种情况下,答案通常是“不”。'

根据我的经验,现代的 C + + 需要一个在团队中对它充满热情的人,一个不能忍受任何缺点的人来推动它。它还需要克服那些希望它更像遗留代码的人的反对意见。

虽然我不认为旧的 C + + 代码库会很快消失,但我相信世界上有更多这样充满激情的人比五年前更多。他们面临着与五年前同样艰难的战斗,但他们更有可能找到志趣相投的人。

是也不是。当然,对于新项目来说,它正变得越来越受欢迎。然而,仍然有其他人没有提到的实际而非政治上的障碍。有很多商业 C + + 库使用来自古老编译器的 ABI,这些 ABI 不能很好地支持现代 C + + 中的特性,而且很多公司依赖这些库。例如,Solaris 上的 Sun Studio 不能在不使用 STLport 的情况下使用 Boost,但是您想要使用的任何第三方商业库都需要使用 Sun 版本的 STL。GCC 2.95和 Redhat Enterprise Linux 也是如此。

令人惊讶的是,使 c + + 更加稳定的努力是如此之少。预警系统已经就位,但进展不大。现在射伤自己的脚比10年前更容易。不知道为什么,但是 c + + 仍然是我最喜欢的语言。:)

我看过 C + + 工作确实在进行中和“现代”库越来越多地用于职位描述,MFC 是一个相当“老式”的 c + + 库很少使用。

我认为我遇到的最大障碍是工具链支持,尤其是跨平台项目。直到几年前,人们还经常看到构建说明上写着“ x 平台需要 STLport 才能工作,因为它们的编译器很烦人”。即使是现在,我也看到人们试图使用与不同版本的 BOOST 相关联的多个第三方依赖关系时出现的问题。这使得连接变得不可能,这意味着你必须从头开始重建你的深度。

现在几乎所有人都停止使用 MSVC + + 6,STLport 的烂摊子已经过去了。但是一旦 TR1问世,我们又回到了“哪个环境的版本支持它,并使它正确”的问题上,这又一次减缓了采用的速度。

我从事于一个1992年开始使用 C 语言(而不是 C + +)的项目。跨遗留代码库部署现代实践是不可能的。同样,我也在从事另一个更接近 C + + 语言前沿的项目。

在回答这样一个问题之前,你必须同意“现代”是什么。这种情况不太可能发生,因为“现代”是一个定义不明确的词,对不同的人意味着不同的东西。亚历山德雷斯库的书名《现代 c + + 设计》(Modern c + + Design)也没什么帮助,因为它主要是一本关于模板超编程的书,这是 c + + 的一个特定领域,但绝不是唯一的一个。

对我来说,是“现代 C + +”!= “模板超编程”。我认为 C + + 在 C 之上的特性可以归为以下几类:

  • 类(构造函数、析构函数、 RAII、动态铸造和 RTTI)
  • 例外
  • 参考文献
  • 标准库(STL)中的数据结构与算法
  • 电子游戏
  • 简单的类和函数模板
  • 模板超编程

这些都不是特别现代,因为它们都已经存在近10年或更长时间了。对于许多用例来说,这些特性中的大多数都是有用的,并且允许您比直接的 C 语言更有效率。一个好的程序员应该并且将会在一个大小合适的项目中使用所有这些工具,但是这些工具中的一个与另一个不同:

模板超编程。

对模板超编程的简短回答就是说“不”。不幸的是,对于一些人来说,它是“现代 C + + 编程”的同义词,因为这本书,但最终它创造的问题比它解决的更多。除非 c + + 开发出更好的泛型机制(如反射) ,否则它将不适合泛型,而更高级的语言(如 Python)将更适合这些用例。有关这一点以及其他许多原因,请参阅 C + + FQA