我已经自学了C++大约4个月了.我很享受,我觉得我做得很好.然而,对我的一个问题的回答让我想到我可能会让自己陷入堕落.
那么,这里的人们如何看待C++作为第一语言学习?现在我开始有一个良好的开端值得我继续吗?
我不明白为什么人们仍然把"语言"与"图书馆"混为一谈.(参考链接的答案.)那么如果C++没有"原生"音频概念呢?有很多库,你可以很容易地使用C++,它们可能比任何"全能""标准库"音频处理API更适合你的特定需求.
咆哮>
C++是一门难懂的语言.还有一些更容易学习.我永远不会争论这个.
但是C++很容易成为最强大的语言之一.它可以是高效的,具有很强的优雅,在一次.当然,没有任何东西可以阻止你制造一切美好的混乱.
如果我推荐C++作为第一种编程语言?实际上,我不知道更好.其他人可能会保护您免于犯错,并使初步成功(例如您的第一个GUI应用程序)更容易.但是如果你建立在C++的基础上,你将始终处于稳固的基础上.实际上,您可能永远不必选择其他语言.但如果你想要/必须,你会发现它非常容易.
经验丰富的C++编码器可以在几周内全速完成Java.反过来呢?很多,很多更加困难.
许多年后,我觉得我应该修改这个答案.由于我的孩子让我教他们编程,我开始这样做.我发现自己实际上并没有从C++开始......因为我首先向他们展示了BF.绝对没有时间,他们了解内存和指针.然后我继续使用C++,到目前为止我们都非常享受自己.
然而再过几年,我觉得我真的应该把Kate Gregory从CppCon 2015这个优秀的演讲添加到这个答案:
停止教授C.
让我这样说吧:
我接受并通过了94%的Sun Java认证,而没有编译过一系列Java(那是九年前).我能够做到这一点,因为我非常了解C++.
在我的第一份专业工作中,我被聘为测试员.在我的第二天,我被告知我可以编程而不是测试,如果我在两周内学到了足够的PowerBuilder.因为我非常了解C++,所以PowerBuilder很简单.
C++ 很难,但如果你学得很好 - 阅读Stroustrup的C++编程语言,也可以练习,阅读他的C++设计和演变,阅读C++ Faq和Meyers书籍以及Herb Sutter的书籍,阅读comp.lang. c ++.审核,阅读Coplien的高级C++编程风格和习语,无论你想要编写什么OO语言 - 如果你学得很好,其他所有OO语言都很容易.
学习C++是学习编码的绝佳准备.(而且你也将成为一名公平的C程序员,但阅读K&R以成为一名优秀的C程序员.)
哦.和C++真的很好玩编程中,很多比Java冗长少,而且更加灵活.你真的负责,而不是IDE或语言.你可以自己射击,但你将负责这样做.一旦你了解了模板,就会阅读亚历山德里斯库的书,它会让你感到惊讶和沮丧,让你高兴.
C++很有趣.阅读"奇怪的重复模板模式":它看起来像这样
template< class T> struct base {}; struct derived: base< derived > {};
是的,你做对了:它是一个派生自派生类模板的基础的类.现在这听起来很晦涩和愚蠢,但它有很多好的用途,就在前几天我打我的头因为你不能用Java做这个(因为Java使用类型擦除,而不是模板,用于泛型),但如果我可以使用它,我可以在很多课程中重复保存很多代码.
在C++中还有很多东西,如果你把自己限制在Java或.Net,你永远不会发现它.
正如其他人所指出的那样,C++并不是一种容易学习的语言,但是它有一些原因使它成为一个体面的起点:
它不会将您绑定到特定的编程范例(例如,Java和OOP),因此您可以轻松地尝试不同的技术
C++没有花里胡哨的东西,所以如果你想知道它们是如何构建的,你可以集中精力制作构建块
因为它是一种语言而不是一个平台,你可以选择最适合手头任务的库或库或你选择的编程风格(例如,选择像Poco这样的Javaesque感觉,ACE用于坚韧不拔的早期风格OO等等.)
它是一种通用的编程语言,而不是一个平台(不得不说两次)
诀窍是第一次仔细而正确地学习它.我知道我和许多其他人一样,在真正理解它之前,通过将其理解为"C +对象"来努力解决它.这是一门难学的语言.我建议您寻找一位经验丰富的C++导师,以及阅读很多关于如何以及如何不编写C++的"强烈推荐"的书籍.避免预先学习坏习惯.
对于没有特定顺序的起始阅读列表:
Koenig和Moo的"加速C++"
Scott Meyers的"Effective C++/STL"
Bertrand Meyer的"面向对象软件构建"
Peter van der Linden的"专家C编程"
Musser,Derge和Saini撰写的"STL教程和参考指南"
Josuttis的"C++标准库"
如果你学习"现代C++"而不是"C加上一些新东西",C++将会更加平易近人.例如,使用std::string
,std::vector<>
和unique_ptr<>
/shared_ptr<>
而不是C风格的字符串,数组和指针.
已经提到的加速C++的科尼希和武是一个书,正是这一点.
这里有很多对c ++的支持,但我不同意.每种语言都有它的优点和缺点(当然,有些语言比其他语言有更好的平衡).
话虽这么说,对于第一语言,我相信大多数人会学习如何使用a)没有编辑 - 编译 - 运行周期的语言更有效地编程(这对你来说本身就比程序员b慢) )具有垃圾收集c)具有良好的运行时内省.如果还有一个交互式评估者,那就最好了.
在这些语言中,开发(如果不是运行时)几乎总是更快,绊倒你的东西更少,并且有更好的工具来帮助计算出错的时候.
这并不是说用c ++这样的语言学习内存管理的变幻莫测并不值得做等等,它不是你真正想要开始的地方.
c ++的另一个问题是,尽管它具有实用性,但它的庞大规模增加了它具有不兼容的部分,这可能导致作为初学者最好避免的微妙问题.
编辑:John D在评论中提出了一点,即一些先学习GC语言(绝不仅限于"脚本"语言)的人从未学过指针.不过,这是一只红鲱鱼.由于种种原因,有些人不能学习各种各样的东西.我坚持认为,当你学习基础知识时,担心指针会分散注意力.在某些时候,您可能需要了解手动内存管理,但首先执行此操作并不是最重要的.或者更确切地说,避免这种情况所取得的成果比成本更重要.
让我说清楚,我不是说c ++是第一语言的劣等选择,因为它缺乏垃圾收集.这只是妨碍学习编程基础知识的众多问题之一.真正的问题是它是一个庞大的复杂语言,到处都是怪癖,甚至是内部不一致(例如指针和异常不能很好地结合在一起).当然,所有这些都可以妥善管理,你可以学习良好的做法,以避免陷入困境.
然而,这一点对于一个真正的新手来说都没有多大意义.因此,一些学习它最终将"以这种方式做,而不是那样"."为什么?" "因为我这么说 - 你还不会理解细节".几乎没有吉祥的开始.
学习第一语言的好处可能在于避免编辑 - 编译 - 运行周期(任何类型)并且具有良好的内省.
如果你有一位好老师,C++作为第一语言就可以了.但这是第一次扩展的相当高的墙,但是一旦你扩展了这面墙,其他类似的语言变得非常容易.
所以,是的,继续.
任何语言都是一种很好的第一语言(在合理范围内,不像lolcode)
一旦掌握了它的工作原理,就可以更容易地扩展到其他语言.