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

时间:2009-09-14 10:12:25

标签: c++ c transition

我现在在Varsity学习C只用了不到2个月,明年我们将继续学习C ++。

我的C编程是否有任何习惯,这有助于将来过渡到C ++,还是最好完全单独考虑它们?

当你学习C然后C ++时,你在C中编码的方式是否以任何方式改变了?

13 个答案:

答案 0 :(得分:27)

答案 1 :(得分:19)

最好的建议可能是将它们视为完全独立的语言。是的,大多数C代码都可以由C ++编译器编译,但它通常不是一个好方法。

C是一种非常低级的hackery语言。你所看到的就是你得到的。它有指针和结构,所以你使用指针和结构。它的类型安全性很小,因此您尽可能忽略类型安全性。

另一方面,

C ++允许大量的抽象。而不是指针,你通常会想要使用迭代器,它在概念上表现为指针,但不是(或可能不是)。

您可以使用模板来保留类型安全性,并且仍然可以重用相同的单个函数定义,而不是丢弃类型信息(例如,函数接受void *以便它们可以使用任何指针类型)。 / p>

您将获得一个出色的标准库,使您能够根据简单的预定义构建块表达复杂的算法。

C ++是一种多范式语言。这里的一些答案说C ++是面向对象的,这部分是正确的。它确实支持面向对象的代码,是的,但这不是C ++ 的原因。

C ++ 支持通用编程,这通常优于OOP。它对函数式编程也有一些有限的支持。当然,它仍然支持C风格的程序编程。 C ++中的技巧是了解所有这些,所以你知道在什么时候使用它。这就是C ++的优势,能够在所有这些范例之间进行切换和混合。那些把C ++称为OOP语言的人会忽略这一点,就像那些称之为改进版C的人一样。它允许你用这两种风格编写代码,但这些风格本身都不值得。 C是一种更好的类C语言,并且有很多更好的OOP语言。如果你想坚持一个单一的范例,请使用为此设计的语言。

答案 2 :(得分:10)

有趣的是,有多少人声称C和C ++“完全不同”,以及“C ++是面向对象的,C不是”......

首先:C ++最初被设计为C语言的扩展。实际上,C ++标准文档引用到C标准。确实,C ++中的许多事情都与C语言不同,但声称两者完全不相符有点远。好的C代码可以用C ++编译器编译,对于一些微不足道的问题,C和C ++解决方案看起来可以完全相同。

其次,不要让自己被愚弄相信C ++是“面向对象的语言”。 C ++是支持面向对象的语言,为true。但它也支持通用编程和过程编程。仅关注C ++的OOP方面会消除它的大部分功能。

至于进入的习惯......不要过于依赖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()函数。数据是程序的重要部分,而不是功能。这将使C ++(和面向对象)的步骤变得更容易。

还有更多,但我并没有声称在一篇SO帖子中回答所有内容。 : - )

答案 3 :(得分:7)

如果你能掌握它,我会推荐C ++ Bjarne Stroustrup的创建者The C++ Programming Language的前3章。

特别是“读者注释”和“C ++之旅”将使您更好地理解C ++与C的不同之处/方式,并集中进一步学习。当然,在使用C ++时,整本书对附近很有用。

有趣的是,对于你的情况,在第1章中,Bjarne实际上说了

  

“在是否继续辩论中   我需要在C ++之前学习C语言   坚信最好去   直接到C ++“。

他当然会,他不会,但如果你接受他的推理,你最好尽快直接进入C ++。

答案 4 :(得分:6)

将语言分开。

C和C ++可以看起来相似,但它们是不同的语言,对于类似的结构具有不同的规则。如果你可以将一个与另一个隔离,那就更好了。

当切换到C ++时,准备忘掉(学习一种不同的,不兼容的方法):

  1. 预处理器:在C ++中,您不应像在C中那样使用预处理器。
  2. 字符串:C没有它们
  3. 指针:可以对C ++进行编码以更安全地处理它们

答案 5 :(得分:4)

C ++程序完全不同。你最好花时间学习C ++,而不是尝试用C ++来改进它们。

例如,即使简单的“Hello World”计划也有很大不同:

C:

#include <stdio.h>
int main(void)
{
  printf("Hello, world!\n");
  return 0;
}

C ++:

#include <iostream>
int main()
{
   std::cout << "Hello, world!\n";
}

(来自here的例子)。

因为'printf'是一个函数,而'cout'不是函数,而是ostream类的实例。

进一步阅读:iostream

答案 6 :(得分:4)

你转向C ++意味着你觉得你需要课程或更好的图书馆。 多数民众赞成我的感受。我也在学习C ++的更好的功能,我的C背景。 现在,我已经看过了矢量[主要是类和模板]。

我觉得语言太熟悉了

  

完全单独考虑它们。

答案 7 :(得分:4)

我的猜测是你将要学习的C ++可能不会过于面向对象,至少它不在我的大学里。我们将C ++程序基本上作为C程序运行。

明确了解如何实现类,以及理解指针的基础知识。

你的文件I / O处理也会有所不同......而不是fstream读取实现iostream函数的语法。

在网上搜索有关简单C ++程序的教程...... CodeProject始终是一个很好的资源。

答案 8 :(得分:3)

尽可能使用结构和函数指针来模仿类和抽象方法的方法。

例如,如果你想要定义一辆车,以及一辆使用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;
 }

答案 9 :(得分:2)

以下是一些要点:

1)确保你精通指针。关注阵列和指针的工作原理,它们之间有什么相同点和不同点。

2)完善c的最佳方法是编写程序。写尽可能多的。对于启动器,您可以为某些库函数编写自定义函数。您可以尝试一下   Strcpy,strcmp,strncpy,memcpy,memmove。

3)学习如何调试。(Gdb非常酷)。

4)开始遵循特定的编码风格并尝试坚持下去。

5)始终为您的代码提供有意义的评论。

答案 10 :(得分:0)

C ++是面向对象的,C不是。如此常见的事情,如保持指针代码清洁和注释函数/方法,并了解如何使用#IFDEFs无法获得无限的预处理器循环。

然而,面向对象的方法通常可以更好地实际编写对象的思考。所以你需要考虑新功能的区别。

答案 11 :(得分:0)

C和C ++中的编程风格完全不同。 C ++是面向对象的编程,其中C是面向过程的编程。 C ++编程是使用类/对象模拟实际问题的最佳方法。但是,指针,结构,运算符,转换运算符,数据处理等基本概念在两者中是相同的。 Sturctures和Classes是相似的概念,但并不完全..因此,当您在'C'学习时,您可以专注于使用结构,指针,运算符和内存管理进行编程

答案 12 :(得分:-1)

函数指针。 Google first hit