我现在在Varsity学习C只用了不到2个月,明年我们将继续学习C ++。
我的C编程是否有任何习惯,这有助于将来过渡到C ++,还是最好完全单独考虑它们?
当你学习C然后C ++时,你在C中编码的方式是否以任何方式改变了?
答案 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 ++中很少使用,因为有更强大(和方便)的替换,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帖子中回答所有内容。 : - )
答案 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 ++时,准备忘掉(学习一种不同的,不兼容的方法):
答案 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。