C:良好的习惯:过渡到C ++

我现在在Varsity学习C只有2个月,而明年我们将继续学习C ++。

我的C编程是否有任何习惯,这将有助于将来过渡到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 ++编译器非常能够优化明显未经优化的代码。 实际上,编译器生成的代码可能与您认为生成的代码完全不同。

不要试图比编译器更好/更聪明,因为:

  1. 你可能已经失去了战斗,因为即使是旧的编译器通常会产生比你今天梦想要做的更好的代码
  2. 即使你今天赢了这场比赛,它也会在明天自动变成失败,因为编译器将来会变得越来越好,所以你今天的“优化代码”将成为未来几年的程序瓶颈和重构主题(没有提到你的可耻记忆)。

所以,相信你的编译器。

不要对代码的生成进行微观管理。 做自己的工作,让编译器自己做。

请注意,此点不应用于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 ++中很少使用,因为有更强大(和方便)的替换, stringvector

密切关注指针和动态内存分配。 虽然优秀的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 ++准备忘掉(学习一种不同的,不兼容的方法)时:

  1. 预处理器 :在C ++中,你不应该像在C中那样使用预处理器。
  2. 字符串 :C没有它们
  3. 指针 :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’

函数指针。 谷歌首次亮相 。