当我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++是否比其他语言更受欢迎.这不是我的问题."现代C++"是C++中方言或编程风格的通用名称,以该书命名" 现代C++设计:通用编程和设计模式应用 ",我只对这与"旧C++"感兴趣.所以不需要告诉我C++的时间已经过去,我们都应该使用Python;))
这就是我认为事情发展的方式.
第一代C++程序员是C程序员,实际上他们使用C++作为C语言.此外,STL还没有到位,所以C++本质上就是这样.
当STL出现时,那些先进的东西,但大多数人写书,拼凑课程和教学课程首先学习C,然后是C++的额外东西,所以第二代从这个角度学习.正如另一个答案所指出的那样,如果你习惯于定期编写循环,那么改变使用std::for_each
并不会给你带来太大的好处,除了你以"现代"方式做事情的温暖模糊感.
现在,我们有使用整个C++的教师和书籍编写者,并从这个角度获得他们的指示,例如Koenig&Moo的Accelerated C++和Stroustrup的新教科书.所以我们char*
当时不学习std::strings
.
这是一个有趣的教训,即"遗留"方法需要多长时间才能被替换,特别是当它们具有有效性的记录时.
绝对没错.对我来说,如果你没有像你所说的那样用"现代C++"风格编写C++,那么使用C++就没有意义了!您可能只是使用C."现代C++"应该是我认为C++编程的唯一方式,我希望每个使用C++并以这种"现代"方式编程的人都会同意我的看法.事实上,当我听说一个不知道诸如auto_ptr或ptr_vector之类的事情的C++程序员时,我总是感到非常震惊.就我而言,这些想法是C++的基础和基础,所以我无法用其他方式想象它.
在Windows 3.1时代,C是标准.当C++进入开发者市场并后来成为ANSI标准时,它就是新的热点.它使用多态性推广了OOP的首字母缩略词和一些基本的设计模式.
现在,随着对C#/ .NET等低障碍进入管理平台的更多接受,使用C++的理由就更少了.很多开发人员都会有一个选择,说实话:C++是一个学习新手的熊.使用C#,您可以使用它.
这真的只留下了需要C++和顽固的C++布道者继续练习艺术的平台.这是一个需要并希望被称为"现代C++"的所有抽象层的社区.
所以是的,我相信"现代C++"正如你所说的那样,正变得越来越流行.尽管如此,它的流行程度与过去使用的不同.
我是其中一个学习如何使用STL并从第1天开始听到很多有关RAII和优秀C++编程实践的人.看起来像今天学习C++的一些最推荐的书籍(如Accelerated C++和Effective C++ series) )专注于使用STL工具而不是卷起你自己的东西,并为有效(或"现代")编程提供了许多"规则".
但与朋友交谈时我也注意到一些公司仍在使用"C with Classes",而不是"Modern C++".也许有一天,"现代C++"的作者和用户提出的文化将占上风.
我认为你刚开始时遇到了糟糕的经历.
你需要自己获得Scott Meyers有效的C++书籍.我在1999年愤怒地开始使用C++,在我被允许检查任何代码之前,我的团队负责人让我坐下来阅读Effective C++和More Effective C++.
他的大部分建议都是"不要使用此功能,但如果必须,请记住这一点"
如果你遵循他的建议,你会写好或"现代"的C++.
他现在也有一本关于STL的书,但我还没读过.
在我的C++工作中,我发现越来越多地使用现代功能,更多人在电话放映和采访中向我询问了这些功能.据我所知,他们正在追赶.
我最初学习的C++就像C with Classes; 尽管语言的发展远远超过了这一点,但我读过的书和我合作过的人都坚持"老C++".RAII人们会想到的东西,而不是自动做的事情,我记得读过一些关于异常安全问题的早期文章.
正如所指出的那样,现在有了新书.许多旧的仍然相关,但他们似乎越来越多地解释为什么显然坏的想法是坏的.(同样地,现代读者很难理解弗洛伊德对无意识思维的革命是什么,因为它现在是传统智慧.)
Stroustrup刚出版了一本教科书,编程:原理与实践使用C++.我买它是因为我还没有从Stroustrup的书中学到好东西,但还没有超过前几章.到目前为止,我只能说我赞同他开始的方式,至少是对如何使用C++的一个很好的介绍.
在我目前参与的项目工作中,有很多C++代码在相当长的一段时间内发展(现在超过10年).您所说的演变在那里清晰可见:旧代码通常是"C with classes" - 原始指针,char*
字符串和相关C函数的使用,数组等; 较新的代码使用ATL智能指针等来管理资源,但大多数时候仍然坚持使用手动编码循环,并且迭代器很少见; 最新的一个是充满了STL容器,算法shared_ptr
(包括管理句柄的自定义删除器等),非常通用的函数和类模板等等.目前,大多数传统的"C with classes"编码技术,例如带有手动生命周期管理的原始未封装指针,在代码审查中非常不受欢迎.由此判断,您的观察结果似乎是准确的.
最近的开发似乎是C++ 0x lambdas的一个时尚 - 它有一个积极的一面,它也倾向于平衡,有利于在手动编码循环上使用标准算法,因为现在你可以让你的所有代码内联算法也是如此.
我不会说std :: vector这些天有资格成为"现代".这是非常基本的.
一般来说,我的印象是人们已经获得了一些现代C++风格的经验,并且稍微清醒了一下.举一个简单的例子,STL for_each很有意思,但实际上它并没有在普通的C循环上增加太多的价值.它更难调试,有时无法提供最佳性能.此外,当前STL中用于函数编程的构造通常非常麻烦,特别是如果您从像ML这样的真实函数语言获得经验的话.
不幸的是,根据我的经验(西班牙大学),规范是不要自己考虑语言.他们使用最简单的语言来教授编程(即Java),因为它应该对教师和学生来说很容易,然后他们将C用于OS类等.
C++的引入非常轻微(无论如何在任何课程中),只是为C提供类.他们没有进入提升甚至STL.我认为跟上C++的所有特征和思维方式对教师和学生来说都是昂贵的.这里有多少C++程序员了解所有Boost库,以便使用它们来提供更好的解决方案或设计它?人们必须有兴趣跟上所有新的图书馆和习语.
然而,正如我所说的那样,一般的编程(特别是编程语言)似乎并没有被认真对待,因为它们在开始工作时似乎是一个时间分配,然后忘记了如何编程,因为它们在企业树.这里的许多企业和大学本身都认为编程可以由任何人完成.
如果你遵循这一理念,那么对于我认识的大多数人来说,C++将始终是"C with classes".
问候,
根据我的经验,它在很大程度上取决于软件产品/项目的年龄.我所知道的大多数新项目都使用现代C++(RAII,STL,Boost).但是,有许多C++项目已经超过10年了,你没有看到现代C++.
另外,请记住,一些最流行的STL实现在5年前就已经破坏了(MSVC <7.0和GNU <3.00)