我现在在Varsity学习C只有2个月,而明年我们将继续学习C ++。
我的C编程是否有任何习惯,这将有助于将来过渡到C ++,还是最好完全单独考虑它们?
当你学习C然后C ++时,你在C中编码的方式是否以任何方式改变?
已经有很多好的答案了。 我的意志更加“以心态为导向”。
数据与行动!
虽然“数据应该表现”可以在C中完成(并且已经完成!),但在C ++中,可以轻松实现所需的一切:封装,构造函数,重载覆盖,模板等。
我发现在C ++编码时,“数据应该表现”是一个非常好的指导原则。
C ++语法糖不是可选的
你会发现许多可以用C语言完成的C ++特性,有些人用它作为不学习它们的借口。 这种心态是危险的(这是“ 将C ++视为一种新语言而不是某些post中看到的扩展 ”的部分)。
避免用C ++方式编写C ++的一个副作用是,虽然C ++开发人员应该理解C ++代码,但是他/她不应该理解你的小型个人框架,它模仿只有C语言的C ++糖。 事实上,他/她对您的框架不感兴趣。 说实话,他/她只会感到怜悯/蔑视你,因为你失去了宝贵的时间。 最终,如果他/她必须使用您的框架而不是C ++糖,他/她会恨你。
像“我可以用C方式做”这样的指导原则只会让你想念马车。 如果你已经拥有这种以C为中心的思维模式,最好不要开始学习C ++。
您选择的语言永远不是最好的。 你应该成为最好的。 如果你编写C ++代码,那么用C ++方式编写它。
C兼容的C ++代码是语义错误
键入你的结构以使它们可以被C编译器编译是一个糟糕的笑话。 使用指针代替引用是对未来自我的一击。 extern "C"
只会让你的代码更弱,而不是更强。 使用void *
来表示通用性只会增加C ++编程人员的数量,他们很乐意付出代价,以极其痛苦的方式移除你的头部。
除非你真的真的需要,否则不要费心去编写与C兼容的代码。
对于您永远不会使用的function,您只需使用耗时的编码风格来衡量自己。
编译器是一个强大的朋友/敌人
低水平工作对一些开发人员有奇怪的影响。 他们对编译代码的控制非常信任。 将此控件委托给更高级别的构造对他们来说很难。
一个很好的例子就是抛弃构造函数/析构函数模式,因为“ 有时,构造函数需要花费太多时间……最好按照我的方式执行… ”。
C ++编译器非常能够优化明显未经优化的代码。 实际上,编译器生成的代码可能与您认为生成的代码完全不同。
不要试图比编译器更好/更聪明,因为:
所以,相信你的编译器。
不要对代码的生成进行微观管理。 做自己的工作,让编译器自己做。
请注意,此点不应用于certificate生成慢/低效代码的合理性。 如果过早优化是所有邪恶的根源,您仍然必须使用您的语言和编译器知识来生成高效且有效的代码(请参阅下一点)。
了解每个C ++构造的优点/ drowbacks /成本
例如,虚拟方法为函数调用添加了一个间接方法,对于某些人来说,性能会急剧下降。 事实是,性能问题通常在其他地方。
无知不是借口。
知道为每个C ++构造生成的代码(即内联,引用,构造函数,析构函数,exception,函数重载,函数覆盖,模板,虚函数等)。 知道什么将被优化,什么不会。
这样,你不仅不会为你不需要的东西买单(这是C ++的指导原则),但你也可以从你的零成本中获益,但却带给你很多。
要谦虚
有人在C ++中进行研究,在他们出生的那天,他们在C ++方面的表现比我们大多数人都要好。 即使我们忽视了Stroustrup , Meyers , Abrahams , Alexandrescu , Sutter等免费精选名字大全也会随着新想法的出现而出现。 尽管(或作为其)外星人的观点,STL是革命性的图书馆。 像Boost这样的库,尽管与一些完整的框架(如Java或.NET API)相比具有“小尺寸”,但它是一个提供给您学习的优秀代码的大型存储库。
仅仅因为你发现一些新function“奇怪”或“外星人”,不要低估它。 试图理解它将PERHAPS为您带来另一种工具,并将始终提高您对语言的掌握程度,并始终让您的大脑工作,这在开发业务中是一件好事。
我认识的大多数人都没有“转换为C ++”而只是假设这个或者这个function没用,因为他们没有理解它。
RAII !!!!
如果您不知道它是什么,请学习它。
如果没有RAII,您的C ++代码就是错误的代码,避免了编译错误。
RAII是C ++最重要的概念。
其他一切都是相关的。
最好的建议可能是将它们视为完全独立的语言。 是的,大多数C代码都可以由C ++编译器编译,但它通常不是一个好方法。
C是一种非常低级的hackery语言。 你所看到的就是你得到的。 它有指针和结构,所以你使用指针和结构。 它的类型安全性很小,因此您尽可能地忽略类型安全性。
另一方面,C ++允许大量的抽象。 而不是指针,你通常会想要使用迭代器,它在概念上表现为指针,但不是(或可能不是)。
您可以使用模板来保留类型安全性,并且仍然可以重用相同的单个函数定义,而不是丢弃类型信息(例如,函数接受void *以便它们可以使用任何指针类型)。
并且您将获得一个出色的标准库,使您能够根据简单的预定义构建块表达复杂的算法。
C ++是一种多范式语言。 这里的一些答案说C ++是面向对象的,部分正确。 它确实支持面向对象的代码,是的,但这不是C ++的代码。
C ++ 也支持generics编程,通常优于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方面会消除它的大部分function。
至于进入的习惯……不要过于依赖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()
函数,该函数最后以适当的顺序调用这些函数。 数据是程序的重要部分,而不是function。 这将使C ++(和面向对象)的步骤变得更容易。
还有更多,但我并没有声称在一篇SOpost中回答所有内容。 ?
如果你能掌握它,我建议C ++ Bjarne Stroustrup的创建者使用C ++编程语言的前3章。
特别是“读者注释”和“C ++之旅”将让您更好地理解C ++与C的不同之处和方式,并集中进一步学习。 当然,在使用C ++时,整本书对附近很有用。
有趣的是,对于你的情况,在第1章,Bjarne实际上说
“在继续讨论是否需要在C ++之前学习C之前,我坚信最好直接使用C ++”。
当然,他会,他不会,但如果你接受他的推理,你最好尽快直接进入C ++。
保持语言分开。
C和C ++可以看起来相似,但它们是不同的语言,对于类似的结构具有不同的规则。 如果你可以将一个与另一个隔离,那就更好了。
当切换到C ++准备忘掉(学习一种不同的,不兼容的方法)时:
你转向C ++意味着你觉得你需要课程或更好的图书馆。 多数民众赞成我的感受。 我也在学习C ++的更好的function,我的C背景。 现在,我已经看过矢量[主要是类和模板]。
我觉得语言太熟悉了
完全分开考虑它们。
我的猜测是你将要学习的C ++可能不会过于面向对象,至少它不是在我的大学里。 我们将C ++程序作为C程序运行。
绝对要了解如何实现类,以及理解指针的基础知识。
您的文件I / O处理也将不同…而不是fstream读取实现iostream函数的语法。
在网上搜索关于简单C ++程序的教程…… CodeProject总是一个很好的资源。
C ++程序完全不同。 你最好花时间学习C ++,而不是尝试用C ++来改进它们。
例如,即使是简单的“Hello World”计划也有很大不同:
C:
#include int main(void) { printf("Hello, world!n"); return 0; }
C ++:
#include int main() { std::cout << "Hello, world!n"; }
( 这里的例子)。
因为’printf’是一个函数,而’cout’不是一个函数,而是一个ostream类的实例。
进一步阅读: iostream 。
尽可能使用结构和函数指针来模仿类和抽象方法的方法。
例如,如果你想要定义一辆车,以及一辆使用C从车辆派生的汽车,你会写(抱歉,我不会检查代码:-)):
struct Vehicle { void (*checkFuel)(Vehicle*); void (*start)(Vehicle*); void (*move)(Vehicle*); void (*stop)(Vehicle*); } void start1(Vehicle* v) { v->checkFuel(v); printf("START!"); } void start2(Vehicle* v) { v->checkFuel(v); printf("VROOOOMM!"); } struct Car { Vehicule base; int (*klaxon)(Car*); } Vehicule* newVehicule() { Vehicule* v=(Vehicule*)malloc(sizeof(Vehicule)); v->start= start1; v->move= (...) return v; } Car* newCar() { Car* c=(Car*)malloc(sizeof(Car)); Vehicule* v=(Vehicule*)c; v->start= start2; v->move= (...) c->kaxon=(...) return c; }
以下是一些观点:
1)确保你精通指针。 关注arrays和指针的工作原理,它们之间有什么相同点和不同点。
2)完善c的最好方法是编写程序。 写尽可能多的。 对于初学者,您可以为某些库函数编写自定义函数。您可以尝试使用Strcpy,strcmp,strncpy,memcpy,memmove。
3)学习如何调试。(Gdb真的很酷)。
4)开始遵循特定的编码风格并尝试坚持下去。
5)始终为您的代码提供有意义的评论。
C ++是面向对象的,C不是。 如此常见的事情,如保持指针代码清洁和注释函数/方法,并了解如何使用#IFDEFs无法获得无限的预处理器循环。
然而,面向对象的方法通常可以更好地实际编码对象的思考。 所以你需要考虑新function的区别。
C和C ++中的编程风格完全不同。 C ++是面向对象的编程,其中C是面向过程的编程。 C ++编程是使用类/对象模拟实际问题的最佳方法。 但是,指针,结构,运算符,转换运算符,数据处理等基本概念在两者中是相同的.Sturctures和Classes是相似的概念,但不完全相同..因此您可以专注于使用结构,指针,运算符和内存管理进行编程。你正在学习’C’
函数指针。 谷歌首次亮相 。
以上就是c/c++开发分享C:良好的习惯:过渡到C ++相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/553080.html