现代C ++变得更stream行了吗?
当我6-7年前第一次学习C ++时,我所学到的基本上是“C with Classes”。 std::vector
绝对是一个高级的话题,如果你真的想要,你可以学习一些东西。 当然没有人告诉我可以利用破坏者来帮助pipe理记忆。 今天,在我看来,我看到了RAII和SFINAE ,STL和Boost,以及现代C ++。 即使刚刚开始使用这种语言的人们,似乎也从第一天开始就教授这些概念。
我的问题是,这仅仅是因为我只看到了“最好的”,也就是这里所提到的问题,还有其他一些倾向于吸引初学者(gamedev.net)的编程站点,或者这是实际上代表的整个C ++社区?
现代C ++真的成为默认? 专家写的不是一些奇特的东西,而是变成“C ++的样子”? 或者我只是无法看到成千上万仍然学习“C类”的人,而不是使用std::vector
编写自己的dynamic数组,并通过手动调用new / delete从顶层代码来进行内存pipe理?
就像我想要相信的那样,如果整个C ++社区在几年内演变得如此之快,这似乎是不可思议的。 你有什么经验和印象?
(免责声明:对C ++不熟悉的人可能会误解标题,问C ++是否越来越受欢迎,这不是我的问题。“Modern C ++”是C ++中方言或编程风格的通用名称,以“ 现代C + +devise:应用generics编程和devise模式 “,我只是对这个与”旧C ++“感兴趣,所以不需要告诉我C ++的时间已经过去了,我们都应该使用Python;))
这是我认为事情已经发展的方式。
第一代C ++程序员是C程序员,实际上他们把C ++作为C来使用。 另外,STL还没有到位,所以这就是C ++的本质。
当STL出来的时候,那些先进的东西,但是大多数人写书,把课程放在一起,而教学class先是学了C,那么额外的C ++的东西,所以第二代就从这个angular度学到了。 另一个回答指出,如果你习惯于定期编写循环,那么改用for_each并不会给你带来太多的收益,除非你以“现代”的方式去做事情。
现在,我们已经有了使用整个C ++的教师和书籍作者,并从这个angular度得到他们的指导,比如Koenig&Moo的Accelerated C ++和Stroustrup的新教科书。 所以我们不学习char *然后std :: strings。
这是一个有趣的教训,需要多长时间才能取代“传统”方法,特别是当他们有效的logging。
绝对没错。 对于我来说,如果你没有按照这个“现代C ++”风格编程C ++,那么使用C ++就毫无意义了! 你可能只是使用C语言。“现代C ++”应该是C ++在我看来是唯一的编程方式,而且我期望每个使用C ++并以这种“现代”方式编程的人都会同意我的观点。 事实上,当我听说一个不了解auto_ptr或ptr_vector的C ++程序员时,我总是十分震惊。 就我而言,这些想法是C ++的基础和基础,所以我无法想象它。
在Windows 3.1的日子里,C是标准。 当C ++打入开发者市场,后来成为ANSI标准的时候,这就是新的热点。 它使用多态性将面向对象的首字母缩略词和一些基本的devise模式普及化。
现在,随着越来越多的低入门级pipe理平台(如C#/ .NET)的接受,使用C ++的理由就越来越less了。 如此多的开发人员基地将有一个select,让我们诚实:C + +是一个新手学习的熊。 用C#,你可以运行它。
这只剩下那些需要C ++和顽固的C ++布道者才能继续实践的艺术平台。 这是需要和想要被认为是“现代C ++”的所有抽象层的社区。
所以是的,我相信“现代C ++”正如你所说的那样变得越来越普遍。 尽pipe如此,它与过去使用的听众不同。
我是那些学习如何使用STL并从第1天就听说过很多关于RAII和良好的C ++编程实践的人之一。看起来像今天学习C ++最推荐的书籍(如Accelerated C ++和Effective C ++系列)专注于使用STL工具而不是卷起自己的东西,同时也为有效(或“现代”)编程提供了许多“规则”。
但是和朋友交谈,我也注意到一些公司仍然使用“C with Classes”而不是“Modern C ++”。 也许“现代C ++”的作者和用户所提出的文化将会在某一天盛行:)
我想你刚开始的时候经历的不好。
你需要得到斯科特·迈耶斯有效的C + +书籍。 我在1999年愤怒地开始使用C ++,在我被允许检入任何代码之前,我的团队领导让我坐下来阅读Effective C ++和更有效的C ++。
他的build议大部分是“不要使用这个function ,但是如果你必须的话,记住这一点”
如果你遵循他的build议,你会写出好的或“现代”的C ++。
他现在也有一本关于STL的书,但是我没有读过。
在我的C ++工作中,我发现现代function越来越多地被使用,越来越多的人在电话放映和采访中询问他们。 据我所知,他们正在赶上。
我最初学习C ++就像C with Classes一样; 虽然语言已经远远超出了这个范围,但是我读到的书和我一起工作的人都坚持“旧C ++”。 RAII的东西会让人想起,而不是自动地做,而且我还记得读过一些关于exception安全问题的早期文章。
正如指出的那样,现在有新书出来了。 许多旧的仍然是相关的,但他们似乎越来越多地解释为什么显然坏的想法是不好的。 (同样,现代读者也很难理解弗洛伊德对无意识思想的观念是怎样的,因为现在已经是传统观点了。)
Stroustrup刚刚出版了一本教科书, Programming:Principles and Practice Using C ++ 。 我买了它,因为我还没有从Stroustrup的书中学到好东西,但是还没有经过前几章。 到目前为止,我所能说的是,我赞同他开始的方式,至less是如何使用C ++的一个很好的介绍。
在我参与的这个项目的工作中,有很多C ++代码已经在很长一段时间内(十多年前)发展了。 你所说的进化在那里是清晰可见的:较旧的代码通常是“C with class” – 原始指针, char*
string和使用相关的C函数,数组等等; 较新的代码使用ATL智能指针等来pipe理资源,但大多数时候仍然坚持手动编码的循环,迭代器是罕见的景象; 最新的是STL容器,algorithm, shared_ptr
(包括定制的删除器来pipe理句柄等),generics化的函数和类模板等等。 大多数传统的“C with class”编码技术,例如带有手动生命周期pipe理的原始未封装指针,在代码评论中是非常令人不满的。 由此判断,你的观察似乎是准确的。
最近的发展似乎是C ++ 0x lambdas的一个时尚 – 它有一个积极的一面,它也倾斜的平衡,有利于使用手动编码循环的标准algorithm,因为现在你可以让所有的代码内联algorithm也是如此。
根据我的经验,这很大程度上取决于软件产品/项目的时代。 我知道的大多数新项目都使用现代C ++(RAII,STL,Boost)。 但是,有很多C ++项目已经有10多年的历史了,而且你没有看到现代的C ++。
另外,请记住,一些最受欢迎的STL实现在5年前(MSVC <7.0和GNU <3.00)
我不会说std :: vector这些天被认为是“现代”的。 这是非常基本的。
一般来说,我的印象是,人们已经获得了一些现代C ++风格的经验,并且有一点清醒。 举一个简单的例子,STL for_each很有趣,但是在实践中,它并没有为一个普通的C语言循环增加可怕的价值。 debugging比较困难,有时不能提供最好的性能。 另外,当前STL中函数式编程的构造通常非常麻烦,特别是如果您从ML等实际function语言中获得经验的话。
根据我的经验(西class牙大学),不幸的是,规范本身不考虑语言。 他们使用最简单的语言来教授编程(例如Java),因为它对于教师和学生来说应该是容易的,然后他们把C用于OS类等等。
C ++被引入很less(无论如何),只是为了提供一个C类。 他们不进入提升甚至STL。 我认为跟上C ++的所有特性和思维方式对于教师和学生都是昂贵的。 有多lessC ++程序员知道所有的Boost库足以使用它们来提供更好的解决scheme或devise它? 一个人必须有兴趣跟上所有的新图书馆和习语。
但是,正如我所说的,似乎一般的编程(特别是编程语言)并不太重视,因为在开始工作时它似乎是一个暂时的任务,然后忘记了如何编程企业树。 这里的很多企业和大学本身都有这样的感觉,任何人都可以编程。
如果你遵循这个理念,那么对于我所知道的大多数人来说,C ++将永远是“C with class”。
问候,
我认为我遇到的最大的障碍是工具链支持,特别是在跨平台项目上。 直到几年前,通常会看到构build说明“x平台需要STLport才能工作,因为它们的编译器是borked”。 即使是现在,我也看到人们试图使用与不同版本的BOOST绑定的多个第三方依赖关系。 这使得链接不可能,这意味着你必须从头开始重新创build你的代码。
现在,几乎每个人都停止使用MSVC ++ 6,STLport混乱在我们身后。 但是,一旦TR1出门,我们就回到“哪个版本的环境支持它并且正确地使用它”,再一次这将减缓采用。
我在1992年开始一个以C(而不是C ++)开始的项目。在现有的代码库中部署现代实践是不可能的。 同样,我也在另一个更接近C ++语言前沿的项目工作。
我曾经听说过的很多团队认为“我们使用例外吗? 题。 这是“我们使用现代C ++吗?”的代码
一旦你不使用exception,你就无法使用该语言和它的库的全部力量。
但是许多旧的代码库是非常规的,并且认为很难将exception压缩到不期望它们的代码库中,或者成为不知道如何使用它们的团队,所以在这种情况下的答案是往往是“不”。
根据我的经验,现代C ++需要一个对团队充满激情的人,他们不能忽视任何东西,并且推动它。 还需要克服那些希望它更像传统代码的人的反对意见。
虽然我不认为旧的C ++代码库会很快消失,但是我相信世界上的这些热情的人比五年前还要多。 他们面临五年前同样艰苦的战斗,但他们更有可能find亲属的精神。
在回答这个问题之前,你必须同意“现代”是什么。 这不太可能发生,因为“现代”是一个定义不明确的词,对不同的人意味着不同的东西。 Alexandrescu的书(Modern C ++ Design)的书名也没有什么帮助,因为它主要是一本关于Template Metaprogramming的书,它是C ++的一个特定领域,但决不是唯一的一个。
对我来说,“现代C ++”!=“模板元编程”。 我会说在C之上的C ++的function将落入这些类别:
- 类(构造函数,析构函数,RAII,dynamic铸造和RTTI)
- 例外
- 参考
- 标准库(STL)中的数据结构和algorithm
- input输出stream
- 简单的类和function模板
- 模板元编程
这些都不是特别现代的,因为他们都已经有近10年或更长时间了。 大多数这些function是有用的,并将允许您在许多使用情况下比直C更高效。 一个好的程序员应该而且会把他们全部用在一个体面的大小的项目中,但其中一个不像其他的那样:
模板元编程。
模板元编程的简短答案只是说不。 不幸的是,对于一些人来说,由于这本书的缘故,它与“现代C ++编程”是同义的,但最终会产生比解决问题更多的问题。 除非C ++开发更好的通用编程机制(如reflection),否则它将不适合generics编程,像Python这样的更高级的语言将更适合这些用例。 对于这个和其他许多原因,请参阅C ++ FQA
最好的学习C ++的书。 Koenig&Moo的“加速C ++”教导了你所描述的现代C ++,所以我想现在大多数人都在使用它。 对于我们这些已经使用C ++很长一段时间的人来说(现在的C ++从80年代中期以来),从编写我们自己的数组,string,散列表(重复广告)这些单调乏味的任务中解脱出来是一个很大的解脱。
我已经看过C ++作业了 ,“现代”库越来越多地用于作业描述,相当“旧式”c ++库的MFC使用得越来越less。
语言在20世纪90年代后期的标准化是第一步,它使得编译器制造商能够专注于“标准”特征集合,也允许语言来修正一些粗糙的边缘,这在标准化过程中出现了。
这反过来又允许基于语言的标准特征来开发框架,而不是基于特定编译器实现提供的特征。 Boost库在这方面值得注意。 这也使得新的发展基于以前的工作,从而为更复杂的问题提供了可能的解决scheme。
这里的一个显着变化是以前的框架是如何基于基类和派生类(运行时特征)的概念的。 但是现在最先进的function通常是基于“recursion”模板(编译时function)。
STL有其优点和缺点,但它经得起时间的考验,如果你想要的东西,工程,很简单STL肯定有一些东西可以帮助你开始。 重新发明轮子是没有意义的(除非出于教导的原因)。
计算机硬件也从20世纪90年代取得了飞跃,然后内存和CPU不再是编译器的限制。 所以书中的大部分理论优化现在都是可能的。
该语言的下一步是支持多核编程,这是0x标准努力的一部分。
是和不是。 当然,新项目越来越受欢迎。 但是,其他人没有提到的实用性而非政治性的收养障碍依然存在。 有很多商业C ++库使用来自古代编译器的ABI,这些编译器不能很好地支持Modern C ++中看到的特性,许多公司依赖于这些库。 Solaris上的Sun Studio不能使用Boost而不使用STLport,但是任何想要使用的第三方商业库都需要Sun的STL版本。 与GCC 2.95和Redhat Enterprise Linux一样的故事。
我们很less意识到如何让c ++更稳定。 预警系统已经到位,但并没有多less进展。 用10年前的脚步来拍自己就更容易了。 不知道为什么,但c ++仍然是我最喜欢的语言。 🙂