Fork me on GitHub
C和C++

别的学校什么情况我不清楚,但是在我们学校是大一上学期就学了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,理论上也是可以完成初始化的。看看代码吧:

View Code
复制代码
 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 !!!

 

 


学习中的一点总结,欢迎拍砖哦^^


 

 
分类: C++IT小百科
posted on 2012-08-20 18:14  HackerVirus  阅读(223)  评论(0编辑  收藏  举报