从Java转向c ++

zen*_*ngr 15 c++ java

在过去的3年里,我一直在开发基于C#(.net)和Java(J2EE)的应用程序.

但是现在我觉得,Java,C#让你感到茫然(从学习的角度来看),你可以快速开发你的应用程序,但是你无法理解编程的基本底层概念.

所以,我正在尝试学习C++,但由于指针,多重继承,一些约定以及Java中不存在的C++的其他概念,我发现它有点"混乱".所以,你们有什么建议?我该怎么想?

谢谢

PS:我是一名学生,所以世界上所有的时间都在转移.

avp*_*vpx 12

在我看来,你应该首先学习C,以便正确理解构建C++的基础.拿起Kernighan和Ritchie的"C编程语言"副本,被广泛认为是该语言的最佳参考,并开始阅读它.一旦你完全理解了C,你将拥有所需的低级基础.

  • C++语言的发明者会不同意你的观点 - 他的话"如果你想学习C++,那就学习C++". (33认同)
  • 不,大家都知道你应该首先用自己的原装7400 IC封装自己的ALU.在CPU的时钟速度与按下面包板上的STEP按钮的速度有关之前,你不能说你知道任何事情.做得对,回归基础. (5认同)
  • @Neil,Steve:如果你想学习C++,可以学习C++.是.但是zengr不想学习C++.zengr想要了解内存管理和虚函数如何工作,并且正在考虑使用C++来学习它.为了这个目标(而不是学习C++),建议学习C. (5认同)
  • @Greg:继续这个主题,在学习汇编之前学习处理器的微代码,这样你就可以理解CPU正在做什么.就此而言,如果他们不能在现代处理器上布置电路,很难相信任何人都可以编写一个像样的Java程序;-p (2认同)
  • @avpx:由于C89没有做C++没有的功能,我不明白你可以从C中学到什么原则,你无法彻底学习C++.实际上,这是两种语言中教科书的"实施质量"问题.K&R确实采用了一种非常低级的方法,知道是否有一个C++文本以同样的方式开始是有趣的,因此为没有迫切需要编写C89的C++程序员提供了相同的好处.虽然我没有K&R的副本可以用来刷新我的记忆,但我觉得TC++ PL并不是那么简单. (2认同)

Dan*_*ker 9

C++不再是任何其他现代编程语言的"基础和底层".它有一个计算机模型(一个平面内存地址空间),但操作系统和CPU只是模拟使用多层缓存和分页的模型,所以它不是"真实的".结果是,相同的操作有时可能比其他时间长1000倍.

现代C++还有许多强大的抽象,与Java和C#中提供的抽象相比,与计算机的工作方式没有更直接的关系.OP提到了多重继承 - 显然没有其他OO语言中的继承元素.从Java中省略的C++的许多其他功能是高级抽象(或允许您构建它们),因此在某些方面Java是更低级的语言.在Java中,运算符符号的含义总是相同的,而在C++中,一个简单的==可能会构建一个对象,该对象稍后将用于生成SQL表达式而不是在进程中执行.

JVM和CLR运行时(几乎可以肯定)用C和/或C++编写,因此从这个意义上说,它们恰好形成了今天的层.但是在C/C++层,你仍然会在一个不是"机器如何工作"的抽象中工作,所以你真的只是在学习一组不同的抽象,而不是"现实".并且可以专门设计OS(或实际上是硬件芯片),以便JVM或CLR(如运行时)是系统的本机低级层; 在这样的系统上,C/C++运行时需要"高级"(昂贵)仿真层才能工作.

因此,可能不值得尝试学习如何在"现实"中编程.这些天没人真的那么做; 这是浪费时间.你最好学习编程抽象如何帮助你编写正确的程序.如果一种语言让你的生活变得困难,那就不能证明你正在做"真实的事情".这只是意味着你选择了错误的语言来完成你想做的事情.

  • 我倾向于不同意这一点.我觉得C++虽然是现代的和高级的,但确实可以用作学习低级别事物而不是Java或C#的学习工具. (4认同)

Jon*_*rdy 5

我不同意你首先需要学习C语言或汇编语言的观点.C++和C在理论上可能相似,但在实际使用方面却非常不同.通过仅使用C,人们对C++惯用语几乎没有什么收获,虽然在多种语言中获得实践经验是很好的,但是在语言学习中指定先决条件是徒劳的.我认为学习编程概念的最好方法是与熟悉它们的人坐下来谈谈,在StackOverflow上,在论坛中,或者,如果你幸运的话,亲自参与.

在一天结束时,我认为编程确实不是那么难,你可能需要有人一次解释它才能让所有内容都点击.这就是为了构建复杂而美观的机器,一遍又一遍地重复相同的简单概念.