我现在在Varsity学习C只有2个月了,明年我们将继续学习C++.
我的C编程是否有任何习惯,这将有助于将来向C++过渡,或者最好将它们完全分开考虑?
当你学习C然后C++时,你用C编码的方式是否以任何方式改变?
已经有很多好的答案了.我的意志更加"以心态为导向".
在C中,所有操作都要像"将此效果应用于此数据"一样.
在C++中,这更像是"数据应该表现".
虽然"数据应该表现"可以在C中完成(并且已经完成!),但在C++中,可以轻松实现所需的一切:封装,构造函数,重载覆盖,模板等.
我发现在C++编码时,"数据应该表现"的想法是一个非常好的指导原则.
你会发现许多可以用C语言完成的C++特性,有些人用它作为不学习它们的借口.这种心态是危险的(这是" 将C++视为一种新语言而不是某些帖子中看到的扩展 "的部分).
避免以C++方式编写C++的一个副作用是,虽然C++开发人员应该理解C++代码,但是他/她不应该理解你的小型个人框架,它模仿只有C语言的C++糖.事实上,他/她对您的框架不感兴趣.说实话,他/她只会感到怜悯/蔑视你,因为你失去了宝贵的时间.最终,如果他/她必须使用您的框架而不是C++糖,他/她会恨你.
诸如"我能用C方式做到这一点"这样的指导原则只会让你想念旅行车.如果你已经拥有这种以C为中心的思维模式,最好不要开始学习C++.
您选择的语言永远不是最好的.你应该成为最好的.如果你编写C++代码,那么用C++方式编写它.
键入你的结构以使它们可以被C编译器编译是一个糟糕的笑话.使用指针代替引用是对未来自我的一击.将extern "C"
只会使你的代码更弱,而不是更强.使用void *
通用性只会增加C++编程人员的数量,他们很乐意付出代价,以极其痛苦的方式删除你的头.
除非你真的真的需要,否则不要费心去编写与C兼容的代码.
对于您永远不会使用的功能,您只需使用耗时的编码风格来衡量自己.
低水平工作对一些开发人员有奇怪的影响.他们非常相信他们对编译代码的控制.将此控件委托给更高级别的构造对他们来说很难.
一个很好的例子就是抛弃构造函数/析构函数模式,因为" 有时,构造函数需要花费太多时间......最好按照我的方式去做...... ".
C++编译器能够优化明显未经优化的代码.实际上,编译器生成的代码可能与您认为生成的代码完全不同.
不要试图比编译器更好/更聪明,因为:
你可能已经失去了战斗,因为即使是旧的编译器通常会产生比你今天梦想要做的更好的代码
即使你今天赢得了胜利,它也会在明天自动变成失败,因为编译器将来会变得越来越好,所以你今天的"优化代码"将成为未来几年的程序瓶颈和重构主题(没有提到你的可耻记忆).
所以,相信你的编译器.
不要对代码的生成进行微观管理.做自己的工作,让编译器自己做.
请注意,此点不应用于证明生成慢/低效代码的合理性.如果过早优化是所有邪恶的根源,那么您仍然必须使用您对语言和编译器的知识来生成高效且有效的代码(请参阅下一点).
例如,虚拟方法为函数调用添加了一个间接方法,对于某些人来说,性能会急剧下降.事实上,性能问题通常在其他地方.
无知不是借口.
知道为每个C++构造生成的代码(即内联,引用,构造函数,析构函数,异常,函数重载,函数覆盖,模板,虚函数等).知道什么将被优化,什么不会.
这样,你不仅不会为你不需要的东西买单(这是C++的指导原则),但你也可以从你的零成本中获益,但却带给你很多.
有些人用C++进行研究,他们出生那天在C++方面的表现比我们大多数人都要好.即使我们忽略了Stroustrup,像Meyers,Abrahams,Alexandrescu,Sutter等名字也经常与新想法一起出现.尽管(或作为其)外星人的观点,STL是革命性的图书馆.像Boost这样的库,尽管与一些完整的框架(如Java或.NET API)相比具有"小尺寸",但它是一个提供给您学习的优秀代码的大型存储库.
仅仅因为你发现一些新功能"奇怪"或"外星人",不要低估它.试图理解它将PERHAPS为您带来另一种工具,并且总是能够提高您对语言的掌握程度,并且总是让您的大脑工作,这对开发商来说是件好事.
我认识的大多数人都没有"转换为C++"而只是假设这个或者这个功能没用,因为他们没有理解它.
如果您不知道它是什么,请学习它.
没有RAII,您的C++代码只是错误的代码,避免了编译错误.
RAII是C++最重要的概念.
其他一切都是相关的.
最好的建议可能是将它们视为完全独立的语言.是的,大多数C代码都可以由C++编译器编译,但它通常不是一个好方法.
C是一种非常低级的hackery语言.你所看到的就是你得到的.它有指针和结构,所以你使用指针和结构.它的类型安全性很小,因此您尽可能忽略类型安全性.
另一方面,C++允许大量的抽象.而不是指针,你通常会想要使用迭代器,它在概念上表现为指针,但不是(或可能不是).
您可以使用模板来保留类型安全性,并且仍然可以重用相同的单个函数定义,而不是丢弃类型信息(例如,函数接受void*以便它们可以使用任何指针类型).
并且您将获得一个出色的标准库,使您能够根据简单的预定义构建块表达复杂的算法.
C++是一种多范式语言.这里的一些答案说C++是面向对象的,这部分是正确的.它确实有面向对象的代码,是支持,但是这不是C++ 的.
C++ 也支持通用编程,通常优于OOP.它对函数式编程也有一些有限的支持.当然,它仍然支持C风格的程序编程.C++中的技巧是了解所有这些,所以你知道在什么时候使用它.这就是C++的优势,能够在所有这些范例之间进行切换和混合.那些把C++称为OOP语言的人会忽略这一点,就像那些称之为改进版C的人一样.它允许你用这两种风格编写代码,但这些风格本身都不值得.C是一种更好的类C语言,并且有很多更好的OOP语言.如果您想坚持一个单一的范例,请使用专为此设计的语言.
有趣的是,有多少人声称C和C++"完全不同",以及"C++是面向对象的,C不是"......
首先:C++最初被设计为C语言的扩展.实际上,C++标准文档是指 C标准.确实,C++中的许多事情都与C语言不同,但声称两者完全不相符有点远.可以使用C++编译器编译好的C代码,对于一些微不足道的问题,C和C++解决方案可以看起来完全相同.
其次,不要让自己被愚弄相信C++是"面向对象的语言".C++是一种支持面向对象的语言,是真的.但它也支持通用编程和过程编程.仅关注C++的OOP方面会消除它的大部分功能.
至于进入的习惯......不要过于依赖C风格的字符串(char *
)和数组(int foo[]
).两者在C++中很少使用,因为有更强大(和方便)的替换,string
以及vector
.
密切关注指针和动态内存分配.虽然优秀的C++代码很少,但您必须了解它们的工作原理.在这样做的同时,您还将了解为什么优秀的C++代码将它们封装起来,或者用引用替换它们,因此它们在生产质量代码中看起来并不多.
当设计你的C代码,开始与struct
持有相关数据(例如地址字段),然后构造该类型结构的工作(功能address_read( struct address_t * )
,address_write( struct address_t * )
,address_modify_name( struct address_t *, char * )
等).最后添加main()
以适当顺序调用这些函数的函数.数据是程序的重要部分,而不是功能.这将使C++(和面向对象)的步骤变得更容易.
还有更多,但我并没有声称在一篇SO帖子中回答所有内容.:-)
如果你能掌握它,我建议C++ Bjarne Stroustrup的创建者使用C++编程语言的前3章.
特别是"读者注释"和"C++之旅"将使您更好地理解C++与C的不同之处和方式,并集中进一步学习.当然,在使用C++时,整本书对附近很有用.
有趣的是,对于你的情况,在第1章,Bjarne实际上说
"在继续讨论是否需要在C++之前学习C之前,我坚信最好直接使用C++".
当然,他会,他不会,但如果你接受他的推理,你最好尽快直接进入C++.
保持语言分开.
C和C++可以看起来相似,但它们是不同的语言,对于类似的结构具有不同的规则.如果你可以将一个与另一个隔离,那就更好了.
当切换到C++准备忘掉(学习一种不同的,不兼容的方法)时:
预处理器:在C++中,你不应该像在C中那样使用预处理器.
字符串:C没有它们
指针:C++可以编码以更安全地处理它们