如何学习编写惯用的C ++?


27

我是一名计算机科学专业的学生,​​因此,我被教导C ++是带有类的C的更好版本。我最终试图在需要解决复杂问题的时候重新发明轮子,直到后来才发现,某种语言功能或某些标准库例程可能为我完成了这项工作。

我所有的舒适与我char**(int*)(someVoidPointer)成语,但最近,制作到一个开源项目(未成年人)的贡献之后,我觉得这不是一个人应该如何编写C ++代码时认为。它与C有很大的不同。

考虑到我对面向对象的编程非常了解,并且我的学习曲线也不错,当我编写C ++时,您对我有什么建议可以使我进入C ++轨道?


7
根据您的注释,您知道C ++语法,仅此而已。您不是用C ++编写代码。stackoverflow上C ++标记是一个不错的起点,它包括阅读列表FAQ。学习的唯一真实方法是编写代码并让有经验的用户发表评论。您可以将代码放在这里进行审查。一个很好的例子
Martin York

1
连同@LokiAstari的建议(我同意)一起,我想说您的朋友是对的,通过Accelerated C ++进行工作可能是个好主意。我怀疑您会发现,您所需的浏览量要少得多-它是为处于您所处位置,已经知道编程并且主要需要学习现代C ++习惯用法的人准备的。
杰里·科芬

是的,实际上我已经完成了前两章,但是其中的大部分内容是我已经知道的-我知道作者不会只是出来为写书:) @LokiAstari感谢您提供的丰富信息:)
yati sagade 2011年

3
@yatisagade不要指望本书能在几章中教给您这种语言的思想。您可能已经很无聊了,因为您已经知道语法了,但是您应该致力于阅读几本C ++书籍,阅读所有内容并做每一个练习,因为您是该语言的初学者。以错误的方式被教导意味着您必须加倍努力,因为您需要忘记错误并学习权利(或类似的东西)。
yannis 2011年

1
我很满意[...]-(int)(someVoidPointer)以前是否曾调试过64位版本?
Ed S.

Answers:


12

根据您的注释,您知道C ++语法。
您不是用C ++编写代码,而是通常称为带有类的C。

stackoverflow上的C ++标记是一个不错的起点,它包括阅读列表FAQ

学习的唯一真实方法是编写代码并让有经验的用户发表评论。您可以将代码放在这里进行审查。一个很好的例子

我对我的“ char *”很满意

停止使用它们,切换到std :: string。

和(int)(someVoidPointer)习语。

停止使用它们(除了与C代码交互)。使用函子概念提供了多个优点(包括封装状态的思想)。

但是最近,在对OSS项目做出了(较小的)贡献之后,我觉得这不是您在C ++中的想法。尽管C有其自己的位置,但它有很大的不同。

是。C和C ++在语言上存在分歧。尽管您实际上可以使用相同的语法,但通常认为优质C代码不是优质C ++代码(反之亦然)。

一些朋友建议使用Accelerated C ++,但是我再次知道什么是类型,什么是类,什么是重载。

您已经掌握了最基本的知识。

一个(被残废的)C ++程序员(恰好具有OO概念)如何用该语言编写惯用程序。

有很多工作:-)


这不是唯一的方法。您可以从好书中学到很多东西。
Dima

1
@Dima:绝对。您可以从书本中学到很多东西。但是,没有什么能打败经验,并且会激怒使用该语言,无法重试失败,并找到最佳方法。我想您可以从一本书中学习法语,但是我怀疑法语会不会使您流利。
马丁·约克

6
恕我直言,最有效的学习方法是从书本开始,学习正确的做事方法,在实践中进行尝试,然后有人批评您的代码。
Dima

@Dima:我对此没有意见。
马丁·约克

12

有效的C ++》一书讲述了许多有趣的事情,并带您领略C ++的功能。还有一个有效的STL-我还没有阅读过,但是我敢肯定,如果您不熟悉STD,那将是一本好书。

要学习的重要一点是,您应该使用语言并且不要不断地重新发明轮子。您已经学习了如何制作它们,因此可以轻松自如(和他人!)并使用工具发挥其全部潜力。

附带说明,您会遇到很多要求使用STD 的人。这与仅使用方法一样心态不佳char*-有时它不是正确的工具,并且还有很多其他工具。从同样的意义上讲,不要气making自己创建容器类-如果您要使用char*最佳的位置来做,则将其安全地包装在类中。


我知道有效的系列,(还没有读过)-但是我想它们是关于最佳实践的,对吧?
yati sagade 2011年

3
@yati sagade:不,从“带有类的C”到成熟的C ++,这些书正是您所需要的。
Dima

我知道-实际上,在加速C ++之后,我得到了Meyers的有效c ++。
yati sagade 2011年

1
@Dima “本书的目的是向您展示如何有效地使用C ++。我假设您已经了解C ++作为一种语言,并且您已经在使用C ++方面有一定的经验。我在这里提供的是使用该语言的指南,以便您的软件是可理解的,可维护的,可移植的,可扩展的,高效的,并且可能表现出预期的效果。 ”-有效的C ++。它还涵盖了许多使阅读变得有趣的“陷阱”。
2011年

1
@Dima:小心点。第二版的目的是从C即将到来的新的C ++程序员(最新)第3版更针对程序员从如Java,C#等语言来
SBI

6

我可以推荐Herb Sutter最近拍摄的BUILD。一个叫做“ 编写现代C ++代码:C ++多年来如何发展 ”的文章:

许多人认为C ++是他们在大学期间经历过的相同语言,或者就像“带类的C”一样,但是多年来,C ++语言已经得到了广泛的发展。在本节中,我们将介绍如何使用C ++编写创新,富于表现力的精美应用程序,以提供强大的性能应用程序。加入我们,看看新近完成的C ++ 0x标准如何使编写C ++与许多其他语言一样高效。

它的演示文稿不错,时间也不长,它具有一些指向最新标准中新功能的很好的指针,这些提示将为您提供一些有关更新旧C / C ++样式的提示。

除此之外,您还需要学习STL-它并不复杂,并且有很多书籍,例如,Effective STL,或者只是Google提供的STL教程,可以助您一臂之力。


+1谢谢。太好了 我很高兴问了这个问题。如此多的精彩链接:)
yati sagade 2011年

4

在使用C ++近十年之后,我读了Andrew Koenig和Barbara Moo撰写的Accelerated C ++,以帮助我教授C ++。(实际上,那时我开始尝试模板元编程。)尽管我认为它并没有教给我有关该语言的任何新知识,但我仍然发现这是一个启示。1个

但是,它教会我的是将C ++作为一种高级语言进行研究和使用。不要修改原始指针,delete并尽可能使用标准库。

我觉得这正是您所追求的。

1 并不是说那时没有什么可以教我的(即使十年后,现在仍然有很多),但是只有太多的知识可以榨取到250页的入门书中。


1

在回答之前-注意:惯用C ++是一个不断发展的目标。随着语言的变化,其成语也随之变化。实际上,某些语言功能旨在使我们摆脱惯用代码,而这些惯用代​​码可以通过语言本身或至少标准库的某些支持而得到简化或改进。因此请记住,任何来源都只能告知您撰写本文时的惯用语。

话虽如此,您最好检查一下:

codereview.SX网站

StackExchange网络有一个名为codereview.stackexchange.com的站点。如果您编写了一段C ++代码(一个类,一个库的一部分,以及不太庞大的东西),则可以将其张贴在此处,并要求社区进行审查。请注意,代码必须经过编译且具有基本功能-该站点不用于调试。

另外,您可以在此处搜索一些与您所从事的工作相关的C ++代码,并查看审阅者的重点。您甚至可以尝试自己查看已发布的代码,而不发布答案,然后阅读其他人对此的看法。

C ++会议视频演示

每年都会举办几次针对C ++的开发者大会:

而且这些都不是唯一的...无论如何,这些每一个都发布了许多/所有演示的视频。这些将教给您很多知识,包括一些惯用的编码以及可以用来决定什么是惯用的原则。

有时您甚至可以得到扬声器的滑盖。


0

好吧,开源项目是一个很好的开始。不要指望根据您的大学课程成为一名专业的程序员,因为他们不是为此而准备的(正如我在此处的回答中所写)。

您似乎已经意识到语法,这很好。现在去阅读他人的代码,并贡献自己的代码以供同行评审。通过阅读代码并尝试理解它,调试和修复它,您将学到很多东西,并且当然-加入它以遵循已经存在的编码约定。

如前所述,专业书籍也是一个很好的主意,浏览StackOverflow上的问题和答案将对您有很多帮助(它肯定会教给我很多知识,我认为自己是C ++专业人员)。


-1

读很多好的C ++代码可能会有所帮助。您必须查看代码才能开始使用它。再说一次,大多数C ++代码是错误的。


“大多数C ++代码是错误的”-您可以澄清吗?我已经看到,大多数OSS项目实际上都保持高质量标准。
yati sagade 2011年

1
项目,是的,但是仔细研究如何做事情常常导致不好的例子。
编码器

1
@yati:我对OSS项目的经验恰恰相反。
2011年

也许@sbi-我参与了Mozilla项目和Google Chrome浏览器(实际上不在这里参与,而是一种学习)。发现自己的纪律出色!
yati sagade 2011年

@yatisagade:至少存在的大多数C ++代码是在该语言确实具有当今编写好代码所必需的功能时编写的;其余的大部分必须使用必须与这些较旧的代码一起使用的库来编写,因此,在某种程度上,必须对这些较新的代码进行适应。而所有这一切,无论编码人员是否投入了体面的设计和实现所需的时间和精力……
einpoklum-恢复莫妮卡
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.