别的学校什么情况我不清楚,但是在我们学校是大一上学期就学了C语言,大一下学期就学了C++。那个时候刚进入软件学院呐,哪里搞的明白什么C/C++,更别说C和C++有什么关系了,就是在不明白的情况下就开始乱用了,也就顺理成章的出现了这样的情况:大家写出来的程序看不明白是C还是C++,于是我们就开玩笑的说他们编的都是“C+”程序。最近也看到了也总有人在面试上问:C和C++有什么区别??于是乎,那就写一篇随笔吧~~~希望大家帮忙补充哦~~~
区别一:
首先,必须要提及的是我是ACM出身,搞了一年半和教练%¥#¥#%#¥~~~(呵呵,不说了~~),也就是说,我最初接触到的是面向过程的思想,很显然了,我的编程语言那个时候是C语言,后来接触到了C++就开始了面向对象的编程,那个时候我们也编过《图书管理系统》等这些老掉牙的东西。也就是说C语言是面向过程的语言,解决问题的思路是,把问题想象成一个过程,通过过程完成输入到输出的转化。而对于C++语言呢?C++可以说是面向对象的语言,考虑问题的思路是构造一些对象模型,每个对象内部包含有方法和数据,这些对象之间可以传递数据来完成功能的。其实严格的说C++是半面向过程半面向对象的,要不怎么出现了C#呢!!(C++++)关于面向过程和面向对象的问题,我想应该不用多解释的,资料多了去了!!
区别二:
学习C++应该首先接触到class吧,其实在C中也有类似的结构的感念叫struct。在C中的struct是这样要求的只包含数据成员,不允许有成员函数,并且默认数据成员是public类型的,即在外部是可以访问的。那么C++也有struct啊,但是是有区别的,C++中的struct是可以有成员函数,但是C++中的默认也是public的,也就是更接近 class 了。那么C++中为什么要同时又struct和class呢?其实在struct和class基本是一样的,主要有下面的四点区别:(1)class中的成员(数据和函数)默认是private,而在struct中默认是public访问权限。(2)对struct的继承默认是public继承,对class的继承确默认是private继承。(3)和template一起使用的区别,class可以替换typename但是struct不可以。(4)能否用大括号{}初始化。对于struct不提供构造函数的话理论上是可以的,因为数据成员默认是public类型的,而对于class,如果数据成员是private访问权限的则不能,public访问权限则可以利用大括号初始化,对于提供了构造函数的class,理论上也是可以完成初始化的。看看代码吧:
1 #include <iostream> 2 3 using namespace std; 4 5 struct A 6 { 7 int x; 8 }; 9 10 class B 11 { 12 public: 13 int x; 14 }; 15 16 class C 17 { 18 int x; 19 }; 20 21 class D 22 { 23 public: 24 int x; 25 D(int i){}; 26 }; 27 28 int main() 29 { 30 A a[3] = {1,2,3}; 31 B b[3] = {4,5,6}; 32 C c[3] = {7,8,9}; //错误的 33 D d[3] = {10,11,12}; 34 return 0; 35 }
区别三:
学过C++的都知道C++中有个叫做“重载”的词儿,这在C++中是比较重要的,但是在C中是没有的,原因要从C和C++的编译的区别说起了,实际上函数被C++编译和被C编译器编译后在符号库中的名字是不同的,我局个例子就都明白了,比如函数bool IsEquel(int x ,int y),通过C语言编译器编译在符号库中是_IsEquel,而通过C++编译器在符号库中就变成了_IsEquel_int_int 了,现在如果还有一个函数bool IsEquel(float x ,float y),通过C++编译器在符号库中变成了_IsEquel_float_float,看看经过编译之后就变成了不同的函数,也就是重载了,而在C编译器中则不是了,现在可能也应该明白了:为什么要用参数个数或者类型的不同作为重载的条件了吧~~呵呵!!
区别四:
C和C++中的内存申请和释放方式也是不同的,在C中使用的是malloc和free,而在C++更经常使用的是new和delete,现在说说这两个组合的不同之处吧:malloc和free是函数,用来动态的申请和释放内存空间,申请的就是内存空间的大小,比如int *p = (int *)malloc(sizeof(int) *10) .实际上malloc主要是用于内置类型的申请和释放,对于对象的创建用malloc则不能满足要求,因为对象的创建要自动调用构造函数,对象在消亡之前要调用析构函数,用malloc/free是不能完成的,这种情况就要使用new/delete的组合了,应该注意的是new/delete是C++中的运算符。
小弟才疏学浅只知道这些主要的区别啦,大牛们,赶快来补充吧~~~~come on !!!
学习中的一点总结,欢迎拍砖哦^^