当我6-7年前第一次学习C ++时,我学到的基本上是“C with Classes”。 std::vector
绝对是一个高级主题,如果您 想要的话,您可以了解一些内容。当然没有人告诉我可以利用析构函数来帮助管理记忆。
今天,无论我看到哪里,我都会看到RAII和SFINAE以及STL和Boost以及现代C ++。即使是刚开始使用该语言的人,也几乎从第1天就开始教授这些概念。
我的问题是,这只是因为我只看到了“最好的”,即SO上的问题,以及其他倾向于吸引初学者的游戏网站(gamedev.net),或者这实际上是整个C ++社区的代表?
现代C ++真的成为默认吗?专家们写的不是一些奇特的东西,而是变成“C ++的方式”吗?
或者我只是无法看到仍然学习“C with classes”并编写自己的动态数组而不是使用std::vector
的成千上万的人,并通过从他们的顶级代码手动调用new / delete来进行内存管理?
尽管我想要相信它,但如果整个C ++社区在几年内发展得如此之多,那似乎令人难以置信。 您的经历和印象是什么?
(免责声明:不熟悉C ++的人可能会错误地将标题误解为询问C ++是否比其他语言更受欢迎。这不是我的问题。“Modern C ++”是C ++中方言或编程风格的通用名称,以其命名书“Modern C++ Design: Generic Programming and Design Patterns Applied”,我对这与“旧C ++”完全感兴趣。所以没必要告诉我C ++的时间已经过去了,我们都应该使用Python;))
答案 0 :(得分:75)
以下是我认为事情已经发展的方式。
第一代C ++程序员是C程序员,实际上他们使用C ++作为C语言。此外,STL还没有到位,所以C ++本质上就是这样。
当STL出现时,那些先进的东西,但是大多数人写书,整理课程和教学课程首先学习了C,然后学习了额外的C ++,所以第二代从这个角度学到了东西。正如另一个答案所指出的那样,如果你习惯于定期编写循环,那么改为使用std::for_each
并不会给你带来太多的东西,除了你以“现代”方式做事情的温暖模糊感。
现在,我们有使用整个C ++的教师和书籍作者,并从这个角度获得他们的指示,例如Koenig& Moo的Accelerated C ++和Stroustrup的新教科书。因此,我们不会char*
,而是std::strings
。
这是一个有趣的教训,即“遗留”方法需要多长时间才能被替换,特别是当他们有效率的记录时。
答案 1 :(得分:57)
绝对是的。对我来说,如果你没有像你所说的那样用“现代C ++”风格编写C ++,那么使用C ++就没有意义了!您可能只是使用C.“现代C ++”应该是我认为C ++编程的唯一方式,我希望每个使用C ++并以这种“现代”方式编程的人都会同意我的看法。事实上,当我听说一个不知道诸如auto_ptr或ptr_vector之类的事情的C ++程序员时,我总是感到非常震惊。就我而言,这些想法是C ++的基础和基础,所以我无法用其他方式想象它。
答案 2 :(得分:25)
在Windows 3.1时代,C是标准。当C ++进入开发者市场并后来成为ANSI标准时,它就是新的热点。它使用多态性推广了OOP的首字母缩略词和一些基本的设计模式。
现在,随着对C#/ .NET等低障碍进入管理平台的更多接受,使用C ++的理由就更少了。很多开发人员都会有一个选择,说实话:C ++是一个学习新手的熊。使用C#,您可以使用它。
这真的只留下了需要C ++和顽固的C ++布道者继续练习艺术的平台。这是一个需要并希望被称为“现代C ++”的所有抽象层的社区。 p>
所以是的,我相信“现代C ++”,正如你所说的那样,正变得越来越普遍。尽管如此,它的受众普遍与过去使用的不同。
答案 3 :(得分:14)
我是其中一个学习如何使用STL的人,并且从第1天开始就听到了很多关于RAII和优秀C ++编程实践的知识。看起来像今天学习C ++的一些最推荐的书籍(如Accelerated C ++和有效的C ++系列)专注于使用STL工具而不是卷起自己的东西,并为有效(或“现代”)编程提供了许多“规则”。
但与朋友交谈时我也注意到一些公司仍在使用“C with Classes”,而不是“Modern C ++”。也许“现代C ++”的作者和用户提出的文化将在某一天占上风:)
答案 4 :(得分:12)
我认为你刚开始时遇到了糟糕的经历。
你需要自己获得Scott Meyers有效的C ++书籍。我在1999年愤怒地开始使用C ++,在我被允许检查任何代码之前,我的团队负责人让我坐下来阅读Effective C ++和More Effective C ++。
他的大部分建议都是“请勿使用此功能,但如果必须,请记住此”
如果你遵循他的建议,你会写出好的或“现代的”C ++。
他现在也有一本关于STL的书,但我还没读过。
答案 5 :(得分:9)
在我的C ++工作中,我发现越来越多地使用现代功能,更多的人在电话放映和采访中向我询问了这些功能。据我所知,他们正在追赶。
我最初将C ++学习为C with Classes;尽管语言的发展远远超过了这一点,但我读过的书和我合作过的人都坚持“老C ++”。 RAII是人们会想到的,而不是自动做的事情,我记得读过一些关于异常安全问题的早期文章。
正如所指出的那样,现在有了新书。许多旧的仍然相关,但他们似乎越来越多地解释为什么显然坏的想法是坏的。 (同样地,现代读者很难理解弗洛伊德对无意识思维的革命是怎样的,因为它现在是传统智慧。)
Stroustrup刚推出了一本教科书,编程:原理与实践使用C ++ 。我买它是因为我还没有从Stroustrup的书中学到好东西,但还没有超过前几章。到目前为止,我只能说我赞同他开始的方式,至少是对如何使用C ++的一个很好的介绍。
答案 6 :(得分:7)
在处理我目前参与的项目时,有很多C ++代码在很长一段时间内发展(现在超过10年)。您所说的演变在那里清晰可见:旧代码通常是“带有类的C” - 原始指针,char*
字符串以及相关C函数,数组等的使用;较新的代码使用ATL智能指针等来管理资源,但大多数时候仍然坚持使用手动编码循环,并且迭代器很少见;最新的一个充满了STL容器,算法,shared_ptr
(包括用于管理句柄的自定义删除器等),非常通用的函数和类模板等等。目前,大多数传统的“C with classes”编码技术,例如带有手动生命周期管理的原始未封装指针,在代码审查中都非常不受欢迎。从这个角度来看,你的观察似乎是准确的。
最近的开发似乎是C ++ 0x lambdas的一个时尚 - 它有一个积极的一面,它也倾向于平衡,有利于使用标准算法而不是手动编码循环,因为现在你可以拥有所有代码也与算法内联。
答案 7 :(得分:6)
根据我的经验,它在很大程度上取决于软件产品/项目的年龄。我所知道的大多数新项目都使用现代C ++(RAII,STL,Boost)。但是,有许多C ++项目已经超过10年了,而且你没有看到现代C ++。
另外,请记住,一些最流行的STL实现在5年前就已经破坏了(MSVC< 7.0和GNU< 3.00)
答案 8 :(得分:6)
根据我的经验(西班牙大学),不幸的是,常规是不要考虑语言本身。他们使用最简单的语言来教授编程(即Java),因为它应该对教师和学生来说很容易,然后他们将C用于OS类等。
C ++的引入非常轻微(无论如何在任何课程中),只是为C提供类。他们没有进入提升甚至STL。我认为跟上C ++的所有特征和思维方式对教师和学生来说都是昂贵的。这里有多少C ++程序员了解所有Boost库,以便使用它们来提供更好的解决方案或设计它?人们必须有兴趣跟上所有新的图书馆和习语。
然而,正如我所说的那样,一般来说编程(特别是编程语言)似乎并不太认真,因为它们在开始工作时似乎是一个时间分配,然后忘记了如何编程在企业树中。这里的许多企业和大学本身都认为编程可以由任何人完成。
如果您遵循这一理念,那么对于我认识的大多数人来说,C ++将始终是“C with classes”。
此致
答案 9 :(得分:6)
我不会说std :: vector最近有资格成为“现代”。这是非常基本的。
一般来说,我的印象是人们已经获得了一些现代C ++风格的经验,并且稍微清醒了一下。举一个简单的例子,STL for_each很有意思,但实际上它并没有在普通的C循环上增加太多的价值。它更难调试,有时无法提供最佳性能。此外,当前STL中的函数式编程构造通常非常麻烦,特别是如果您从ML等真正的函数式语言中获得经验。
答案 10 :(得分:4)
我认为我遇到的最大障碍是工具链支持,特别是在跨平台项目上。直到几年前,通常会看到构建说明“x平台需要STLport才能正常工作,因为它们的编译器已被禁止”。即使是现在,我也发现人们试图使用与不同版本的BOOST绑定的多个第三方依赖项的问题。这使链接变得不可能,这意味着你必须从头开始重新开始你的deps。
现在几乎每个人都停止使用MSVC ++ 6,STLport的混乱已经落后于我们。但是一旦TR1出现,我们就会回到“哪个版本的环境支持它并正确”,这将再次减缓采用。
我在1992年开始用C(而不是C ++)开始的项目。在遗留代码库中部署现代实践是不可能的。同样,我在另一个更接近C ++语言前沿的项目上工作。
答案 11 :(得分:3)
我一直在听到的许多团队都认为“我们是否使用例外?”题。这是“我们使用现代C ++吗?”的代码。
一旦您不使用例外,您就无法使用该语言及其库的全部功能。
但是许多较旧的代码库都是无异常的,并且很难将异常分解为不期望它们的代码库,或者变成不知道如何使用它们的团队,所以答案在这种情况通常是“不”。
根据我的经验,现代C ++需要一个对团队充满热情的人,他们无法忍受任何更少的东西,推动它。它还需要克服那些希望它更像遗留代码的人的反对意见。
虽然我不认为旧的C ++代码库很快就会消失,但我相信世界上这些热情的人比五年前更多。他们面临着五年前面临的同样艰难的战斗,但他们更有可能找到志趣相投的精神。
答案 12 :(得分:3)
在回答这个问题之前,你必须就“现代”是什么达成一致。这不太可能发生,因为“现代”是一个定义不明确的词,对不同的人意味着不同的东西。 Alexandrescu的书(现代C ++设计)的标题也没有真正帮助,因为它主要是一本关于模板元编程的书,它是C ++的一个特定领域,但绝不是唯一的一个。
对我来说,“Modern C ++”!=“Template Metaprogramming”。我想说C ++上的C语言特征将属于这些类别:
这些都不是特别现代,因为它们都已经存在了近10年或更长时间。这些功能中的大多数都很有用,并且可以让您在许多用例中比直接C更高效。一个优秀的程序员应该并且将在一个体面的项目中使用它们,但其中一个不像另一个:
模板元编程。
模板元编程的简短答案就是说不。不幸的是,对于某些人来说,它是“现代C ++编程”的同义词,因为这本书,但最终它产生的问题比它解决的更多。除非C ++开发出更好的通用编程机制(如反射),否则它将不适合泛型编程,而像Python这样的高级语言将更适合这些用例。出于这个原因和其他许多原因,请参阅C++ FQA
答案 13 :(得分:2)
学习C ++的最佳书籍。 Koenig& Co.的“加速C ++” Moo,教你所描述的现代C ++,所以我想现在大多数人都在使用它。对于我们这些已经使用C ++很长一段时间的人(从我80年代中期开始),现代C ++可以很好地减轻编写我们自己的数组,字符串,哈希表(重复广告恶心)的繁琐任务。 / p>
答案 14 :(得分:2)
我看过C++ Jobs on indeed,“现代”库越来越多地用于作业描述,MFC是一个相当“老式”的c ++库,使用较少。
答案 15 :(得分:1)
20世纪90年代后期语言的标准化是第一步,它允许编译器制造商专注于“标准”特征集,也允许语言修复一些粗糙的边缘,这似乎通过标准化处理。
这反过来允许基于语言的标准特征开发框架,而不是基于特定编译器实现提供的特性。 Boost库特别是在这方面。这也允许新的开发基于以前的工作,从而为更复杂的问题提供可能的解决方案。
这里一个值得注意的变化是以前的框架是如何基于基类和派生类(运行时特征)的概念的。但是现在大多数高级功能都基于“递归”模板(编译时功能)。
STL有它的优点和缺点,但它经受住了时间的考验,如果你想要一些有效的东西,并且简单的STL肯定有一些东西可以帮助你开始。重新发明轮子是没有意义的(除非出于教学原因)。
从20世纪90年代开始,计算机硬件也有了很大的发展,然后内存和CPU不再是编译器的约束。因此,现在大多数书籍的理论优化都是可能的。该语言的后续步骤是支持多核编程,这是0x标准工作的一部分。
答案 16 :(得分:1)
是和否。当然,对于新项目,它越来越受欢迎。但是,仍然存在采用的障碍,这些障碍是实际的,而不是政治性的,而其他人则没有提及。有许多商业C ++库使用来自古代编译器的ABI,这些库不能正确支持Modern C ++中的功能,许多公司都依赖这些库。例如,Solaris上的Sun Studio无法在不使用STLport的情况下使用Boost,但是您想要使用的任何第三方商业库都需要Sun的STL版本。与GCC 2.95和Redhat Enterprise Linux相同的故事。
答案 17 :(得分:-3)
令人惊讶的是如何使c ++更稳定。警告系统已经到位,但它并没有发展很多。与10年前相比,用脚射击自己更容易。不知道为什么,但c ++仍然是我最喜欢的语言。 :)