现代C ++越来越流行吗?[关闭]


132

当我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;))


2
不幸的是,我认为距离整个C ++社区的发展还需要一段时间,以便能够认识到如何使用标准库,并随着即将到来的C ++ 0x的添加而有效地提高,更不用说使用类似的方法来实现代码了。但是,我认为C ++ 0x为提高C ++的普及度带来了很多希望。许多日常语法上的不便已得到改善。我一直认为这些事情很琐碎,但是对于外部人来说,这是常见的抱怨来源。
stinky472 2010年

15
就我而言,每当遇到一名了解RAII和异常安全之类的现代C ++技术的专家(不一定参考Alexandrescu的书),甚至是最基本的概念(如迭代器和泛型算法)时,我都会发现十多名不理解的专家。至少在专业人员方面,很多人都赶不上截止日期以学习任何已知的知识,因此,即使自称是C ++专业人员的人也经常需要学习很多东西。恐怕我也将成为使用C ++ 0x的人之一:为此我需要学习和适应很多东西,而且我有截止日期。
stinky472 2010年

Answers:


76

这就是我认为事情发展的方式。

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

当STL出现时,它具有先进性,但是大多数人写书,汇总课程和讲课都首先学习了C,然后学习了额外的C ++知识,因此第二代从这种角度学习了。另一个答案指出,如果您习惯于定期编写for循环,则更改使用范围std::for_each不会给您带来多少好处,除了给人以“现代”方式做事的温暖模糊感。

现在,我们已经有使用整个C ++的讲师和书籍作者,并且从这种角度获得了他们的指导,例如Koenig&Moo的Accelerated C ++和Stroustrup的新教科书。所以我们char*那时不学std::strings

关于“传统”方法的替换需要多长时间,这是一个有趣的教训,特别是当它们具有有效性的记录时。


13
是。由于C编码器的庞大安装基础,使C ++与C高度向后兼容非常聪明。与MS始终与DOS保持向后兼容性的成功策略非常相似。(请参阅Raymond Chen出色的博客,了解他们经常经历的痛苦
时光

2
哎呀,在那儿有点切线...意思是说我认为您对那些从C转变(但保持C风格的思维)的人和那些“初尝”的人之间的“世代鸿沟”是正确的是STL后的C ++。
j_random_hacker

57

绝对没错。对我来说,如果您不是按照您所说的那样使用“现代C ++”风格来编程C ++,那么使用C ++毫无意义!您可能还只是使用C。在我看来,“现代C ++”应该是C ++编程的唯一方式,并且我希望使用C ++并以这种“现代”方式编程的每个人都同意我的看法。实际上,当我听到一个C ++程序员不知道诸如auto_ptr或ptr_vector之类的东西时,总是感到非常震惊。就我而言,这些想法是C ++的基础和基础,因此我无法想象其他方式。


4
+1; 我很早就选择了“现代c ++”样式,因为这是一种自然的方式(如果您不打算在类中使用C)。
亚当·霍斯

21
“只用C吗?” C真厉害。
Clark Gaebel 2010年

4
这些机器人肯定不会使用C ++进行编程,它们不够愚蠢,并且会冻结尝试对其进行编译。
马特·乔纳

6
@ClarkGaebel好吧,如果C功能强大,那么C ++从C继承而来的C也没有问题:)
legends2k 2013年

4
@rxantos,您说的是,就像我们没有足够的选择来评估性能一样,例如查看程序集输出,计时器,RAM监视器等等。在这方面,C ++与C没什么不同。如有疑问,请简介。其他的只是传闻。
underscore_d 2015年

25

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

现在,随着人们对C#/。NET之类的低障碍进入管理平台的广泛接受,使用C ++的理由越来越少。因此,很多开发人员都有选择余地,说实话:C ++是新手学习的熊。使用C#,您可以运行它。

实际上,实际上只有NEED C ++和顽固的C ++传播者可以继续练习该艺术的平台。这是需要并想要被视为“现代C ++”的所有抽象层的社区。

所以是的,我相信正如您所说的那样,“现代C ++”正变得越来越普遍。尽管它与过去使用过的受众不同,但很普遍。


伙计们,这个答案很不错。C ++并不是完美的,我们都知道,Bjarne本人抱怨它太大而且太难学习。尽管我不同意现代C ++为何如此迅速地出现-恕我直言,这么大的语言要花很长时间才能“滚滚向前”。
j_random_hacker 2009年

4
因此,您是说越是普通的开发人员转而使用C#等,而越是坚决的开发人员则更多地使用C ++?(并不是说没有真正聪明的C#/。NET人员,但是还有很多不那么聪明的人。)从某种意义上讲。
David Thornley,

3
我认为这是有道理的。当然,并不是每个人都这样,但是在很大程度上,我同意,大多数有选择的人已经选择了C#或Java或其他此类语言。
jalf

3
用例:我希望Windows客户端对我的数据库执行CRUD。使用C#/。NET还是C ++ / MFC?我想要一个Web应用程序...使用C#/ ASP.NET或C ++ / ISAPI?我想要使​​用DirectX C#/。NET或C ++ / MFC / WTL进行简单的“ Nybbles”克隆吗?我想要在Assembly09上获奖的演示...绝对是C ++(相对于C#)。
spoulson

8
我不知道这是更多的抽象层还是更多的顽固问题。我怀疑这只是该可通过模板,抽象的只是没有提供Java或C#,所以谁喜欢或需要他们呆在一起C ++的人。
Kragen Javier Sitaker,2009年

16

我就是其中的一员,他们从第一天开始就学会了如何使用STL,并从中获得了很多有关RAII和良好C ++编程实践的知识。 )着重于使用STL工具,而不是自己动手做,还提供了许多“规则”以进行有效(或“现代”)编程。

但是与朋友交谈时,我还注意到一些公司仍在使用“带有类的C”而不是“现代C ++”。也许有一天,“现代C ++”的作者和用户提出的文化将会流行:)


在我工作的地方,我们仍将C与类一起使用,这可能是因为有很多旧计时器已经存在了一段时间。他们甚至对STL都非常警惕,更不用说BOOST了。
轶事

12

我认为您刚开始就经历过糟糕的经历。

您需要获取Scott Meyers高效的C ++书籍。我在1999年因愤怒而开始使用C ++,在允许我签入任何代码之前,我的团队带领我坐下来阅读了《 Effective C ++》和《更有效的C ++》。

他的大部分建议都基于“不要使用此功能,但如果需要,请记住一点”

如果您遵循他的建议,您将编写出色的或“现代的” C ++。

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


我应该提到,这只是我的起点。今天,我对STL,boost,RAII和其他所有功能都非常满意。我只是想知道我最初的经历有多普遍。
jalf

9

在我的C ++工作中,我发现现代功能正得到越来越多的使用,并且越来越多的人通过电话筛选和采访向我询问这些功能。据我所知,它们正在流行。

我最初学习C ++的方式像是使用C语言编写类。尽管语言的发展远不止于此,但我阅读的书籍以及与我合作的人都坚定地坚持使用“旧C ++”。人们会想到RAII,而不是自然而然地想到,我记得读过一些有关异常安全问题的早期文章。

如前所述,现在有新书问世。许多旧的观点仍然有意义,但是它们似乎越来越多地解释了为什么不好的观点显然是不好的。(类似地,现代读者很难理解弗洛伊德关于潜意识的革命性思想是多么的革命,因为它现在已经成为常规知识。)

Stroustrup刚出版了一本教科书,《编程:使用C ++的原理和实践》。我买它是因为我还没有从Stroustrup的书中学到好东西,但是还没有走过前几章。到目前为止,我只能说我认可他的创建方式,并且至少是对如何使用C ++的很好的介绍。


甚至STL的第一个版本也不是异常安全的。
Kragen Javier Sitaker,2009年

2
那时,没有人真正知道如何编写异常安全代码。该标准发布后的几年就已经解决了。我记得C ++报告中的一些文章。
David Thornley,2009年

7

在我目前参与的项目上工作时,有许多C ++代码已经在相当长的一段时间(现在已经超过10年)中发展了。您所说的演变在这里很明显:较旧的代码通常是“带有类的C”-原始指针,char*字符串以及相关C函数,数组的使用等;较新的代码使用ATL智能指针等来管理资源,但在大多数情况下仍坚持使用手工编码的循环,并且迭代器实在难得。最新的是塞满了STL容器,算法,shared_ptr(包括用于管理句柄的自定义删除器),高度泛化的函数和类模板,等等。如今,大多数传统的“带有类的C”编码技术,例如具有手动生命周期管理的原始未封装指针,在当今的代码审查中都已被人们所忽视。由此看来,您的观察似乎是正确的。

最新的发展似乎是C ++ 0x lambda的一种时尚-它具有积极的一面,因为它可以使平衡趋向于支持使用标准算法而不是手工编码的循环,因为现在您可以将所有代码与算法。


6

这些天我不会说std :: vector符合“现代”标准。这真的很基础。

总的来说,我的印象是人们已经获得了一些现代C ++风格的经验,并且有些发呆。仅举一个简单的例子,STL for_each很有趣,但是在实践中,它不会在纯C循环中增加很多可怕的价值。它很难调试,有时无法提供最佳性能。同样,当前STL中用于函数式编程的构造通常非常繁琐,尤其是如果您从ML等真正的函数式语言中获得经验的话。


1
为什么说向量不符合现代标准?即使是最基本的情况,它仍然是许多用例的最新技术。但是我认为基本的东西并不意味着它不是现代的。相反,如果有的话。但我想我同意您的第二段:)
Johannes Schaub-litb

4
但是我认为这是因为一些人试图将for_each和friends基本上用于所有内容,甚至用于简单的for循环会更简洁的东西-将2行循环最多膨胀10行。我希望当lambda可以在C ++ 1x中使用时,更多的人会使用for_each和朋友
Johannes Schaub-litb 2009年

7
向量是基本要点。它并不总是基本的。曾经,它通常被视为超级复杂(它使用TEMPLATES)和低效(它不是原始数组)的东西。专家可能会讲些什么,但许多人只是不信任。
jalf

2
也许因为与说... std :: transform相比,std :: for_each几乎不需要什么?使用算法可以帮助您摆脱一个非常常见的错误:错误的循环条件。
爱德华A.

vector <bool>当然不是基本的...
Kugel 2013年

6

不幸的是,根据我的经验(西班牙大学),准则是不考虑语言本身。他们使用最简单的语言来教编程(即Java),因为这对老师和学生来说都很容易,然后他们将C用于OS类等。

C ++的介绍非常细微(无论如何,在任何课程中),只是为C提供了类。他们没有得到提升,甚至没有获得STL。我认为,跟上C ++的所有特征和思维方式对老师和学生来说都是昂贵的。这里有多少C ++程序员对所有Boost库都足够了解,可以使用它们来提供更好的解决方案或对其进行设计?必须对跟上所有新库和惯用语感兴趣。

但是,正如我所说,似乎一般的编程(尤其是编程语言)并不太认真,因为这似乎是他们开始工作时的临时任务,但随后却忘记了如何编程。企业树。这里的许多企业以及大学本身都认为任何人都可以进行编程。

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

问候,


大多数情况在计算机科学中很常见,总的来说,我认为这不是一件坏事。(不专注于语言,也就是说,显然应该正确地教授所教的语言)。
jalf

+1:“((不专注于语言,也就是说,显然应该正确地教授aRE所教的语言)”
Jared Updike

6

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

另外,请记住,直到5年前,一些最流行的STL实现几乎都被破坏了(MSVC <7.0和GNU <3.00)


4

我认为我遇到的最大障碍是工具链支持,尤其是在跨平台项目中。直到几年前,通常会看到构建说明说“ x平台需要STLport才能工作,因为它们的编译器很烂”。即使到现在,我仍然看到人们尝试使用绑定到不同版本BOOST的多个第三方依赖项的问题。这使得无法进行链接,这意味着您必须返回并从头开始重建部门。

现在几乎每个人都停止使用MSVC ++ 6,STLport混乱就过去了。但是,一旦TR1面世,我们就会回到“哪些环境支持它并正确使用哪个版本”的问题,这将再次减慢其应用速度。

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


3

我参加过的许多团队都听说过要考虑“我们是否使用异常?题。这是“我们在使用现代C ++吗?”的代码。

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

但是,许多较旧的代码库都是无例外的,并且很难将异常的错误塞入不期望它们的代码库或不知道如何使用它们的团队中,因此在这种情况下的答案是经常“不”。

以我的经验,现代C ++需要团队中对它充满热情的人来推动它。它还需要克服那些希望它更像旧代码的人的反对。

尽管我认为旧的C ++代码库不会很快消失,但我确实相信与5年前相比,世界上有很多热情的人。他们面临着与五年前一样的艰苦战斗,但他们更有可能找到同志灵魂。


3

在回答这样的问题之前,您必须同意什么是“现代”。这不太可能发生,因为“现代”这个词定义不清,对不同的人意味着不同的意思。Alexandrescu的书(现代C ++设计)的书名也没有任何帮助,因为它很大程度上是一本关于模板元编程的书,这是C ++的特定领域,但绝不是唯一的一本书。

对我来说,“现代C ++”!=“模板元编程”。我想说的是C ++的C ++功能可以归为以下几类:

  • 类(构造函数,析构函数,RAII,动态转换和RTTI)
  • 例外情况
  • 参考资料
  • 标准库(STL)中的数据结构和算法
  • iostreams
  • 简单的类和函数模板
  • 模板元编程

这些都不是特别现代,因为它们都已经存在了将近10年或更长时间。这些功能大多数都是有用的,在许多用例中,它们将比纯C更有效率。一个好的程序员应该并且将在一个体面大小的项目中使用它们,但是其中之一与另一个不一样:

模板元编程。

模板元编程的简短答案就是拒绝。不幸的是,由于这本书,对于某些人来说,它是“现代C ++编程”的代名词,但最终,它产生的问题比解决的问题还多。除非C ++开发出更好的通用编程机制(如反射),否则它将不适用于通用编程,而像Python这样的高级语言将更适合这些用例。因此,请参见C ++ FQA


6
应用程序编程几乎不需要IMHO模板元编程,因为它只能提供可能不必要的通用性,但会降低可读性和难以理解的错误。但是OTOH 在构建库时(la Boost)对专家来说非常有用,因为库中增加了通用性,并且隐藏了(难看,棘手,令人困惑的)机制。
j_random_hacker 2010年

3
您是对的,如果适度使用模板元编程,则可以高雅地使用它,尤其是在库中。但是我经常看到人们在模板元编程的道路上走得太远,结果他们的程序遭受了损失。我并不反对元编程,实际上我是元编程的坚决拥护者,只是C ++的功能非常粗糙。
Anton I. Sipos 2010年

2

学习C ++的最佳书。Koenig&Moo撰写的“ Accelerated C ++”教了您所描述的现代C ++,所以我想这些天大多数人都在使用它。对于我们已经使用C ++一段时间(自80年代中期以来)的那些人来说,现代C ++摆脱了编写我们自己的数组,字符串,哈希表(重复的广告恶作剧)这样繁琐的任务。


1
并不是要坏死,但我只是根据这个建议买了这本书。我们得看看!
Andrew Weir


1

1990年代后期,该语言的标准化是第一步,它允许编译器制造商专注于“标准”功能集,还允许该语言修复一些在标准化过程中出现的粗糙现象。

反过来,这允许根据语言的标准功能而不是由特定编译器实现提供的功能来开发框架。Boost库特别是在这方面。这也允许新的开发基于以前的工作,从而为更复杂的问题提供可能的解决方案。

这里的一个显着变化是以前的框架如何基于基类和派生类(运行时功能)的概念。但是,现在大多数高级功能通常都很大程度上基于“递归”模板(编译时功能)。

STL有其优点和缺点,但是它可以经受住时间的考验,如果您想要一些可行且简单的东西,那么STL肯定可以帮助您入门。重新发明轮子没有任何意义(除非出于教义原因)。

自1990年代以来,计算机硬件也有了长足的飞跃,然后内存和CPU不再是编译器的约束。因此,现在可以进行书籍中的大多数理论优化。

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


1

是的,没有。当然,对于新项目,它越来越受欢迎。但是,仍然存在其他人没有提到的实用的而不是政治的障碍。有许多商业C ++库使用的是古代编译器提供的ABI,它们不能正确支持现代C ++中的功能,并且许多公司都依赖这些库。例如,Solaris上的Sun Studio不能在不使用STLport的情况下与Boost一起使用,但是要使用的任何第三方商业库都将需要Sun的STL版本。与GCC 2.95和Redhat Enterprise Linux相同。


-3

令人惊奇的是,使c ++更加稳定的工作量很小。预警系统已经到位,但进展不大。比起十年前,用脚射击自己甚至更加容易。不知道为什么,但是c ++仍然是我最喜欢的语言。:)


我建议先读此线程中的几本书,然后再声明要投入到C ++稳定中的“小努力”,并且“比10年前更容易动手。”
Patrick Niedzielski 2012年

当然,std库在内存分配和字符串操作方面提供了一定的稳定性。不幸的是,在内部它使用了如此奇怪的编码约定,以至于您认为它是由外星人或其他人编写的。:)
AareP

2
由于标准库是一个规范,因此,请怪您的编译器供应商使用奇怪的内部编码约定。此外,奇怪的编码约定= / =不稳定或更容易被人枪shoot。这些编码约定中的大多数(至少谈论MSVC库,也可能谈论其他约定)完全不干扰您,因此您可以做一些愚蠢的事情,而该库无需在意。如果您在C ++规范之外进行编码,那是另一回事。
Patrick Niedzielski

需要注意的是一个典型的STL实现(特别是当它捆绑了特定的编译器)也没有必须使用标准C ++来实现自身。它可以很好地利用其内部的特定于实现的知识,以便为您的代码提供标准所承诺的保证。但是,您自己的代码应仅遵循标准所保证的内容。您不能通过检查特定的C ++或STL实现来了解标准保证。
Tanz87年

这个答案是十年前写的。当时,令人惊奇的是,为使c ++ 稳定而付出了很多努力。这是c ++ 0x花很长时间才能作为c ++ 11发行的主要原因之一。
David Hammen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.