c语言与c++的区别详解
1从C语言到C++
1980年,Bjarne Stroustrup博士着手创建一种新的语言,能够具有面向对象的程序设计特色。在当时,面向对象编程是一个新颖的概念,Stroustrup博士并不是从头开始设计新语言,而是使用C语言进行修改,而这就是C++语言。
C++是C的超集,也就是说C++是可以兼容C语言的,C++在C语言的基础上增加了许多的特性和概念,他通关关键字的方式进行实现,不过本文不重点说明C++和C语言的区别,本文只是从数据结构的角度去观测两语言之间的问题,并且说明C++的改进,从本文开始,将会在C语言的基础上开始用到C++的特性和概念去实现数据结构,这将方便我们的程序设计。
2.代码改变
介绍几个很明显的转变我们以后会很常用,这些可以在C语言网的C++教程中看到,如果你已经学过C++,建议你可以直接跳过本段内容,如果你对于C++还一知半解的,建议你在阅读本文的同时去翻阅C++的学习资料,两者的学习并不冲突,相反他们相辅相成。
2.1头文件引用
C语言的引用头文件的方式是include名字.h的方式进行引用,而C++去掉了.h(虽然在绝大多数编译器上任然使用.h的方法也不会报错)而是改成直接引用名字即可,这里需要注意的是C++使用C语言标准时,需要在库前面添加一个C来表明这个库是来自于C语言的。
2.2输入与输出
C++的输入输出与C语言指定类型的不同,C++采用“流”的思路去进行输入输出设计,这样的做法可以大大简化我们的设计,但是这样的做法确是更慢,本章稍后会介绍输入输出的优化,将会重讲本内容。
3. 对比
C++与C相比最突出的部分就是多了一个类的概念,由此衍生出了封装,继承,重载,多态。
封装的概念有点像C语言里的结构体,但是结构体不能够成员函数,也不能定义变量的访问权限,也不能够被继承。
而继承就是一个类可以由其父类继承得到,如你定义了一个类为 动物,你可由动物这个类来定义 狗 猪 等等类别。
而重载就是最容易理解的是运算符的重载, 比如在C语言里面的 - 运算符不能够直接实现 (2008.5.1 - 2006.1.2)的运算,而在C++中通过运算符的重载就可以直接实现如上的日期运算了。
而多态比较难以概括,还要涉及到虚函数的概念,简单的说就是可以更具类别来选择相应的成员函数的实现形式。
3.1详细区别对比
3.1.1函数默认值
C语言中:
C89标准的C语言不支持函数默认值
这种操作在C89下是行不通的,在C语言下这么写就会报错。
C++中:
C++支持函数默认值,且需要遵循从右向左赋初始值
例如:int FUN(int a = 10);
代表没有传参调用的时候,自动给a赋一个10的初始值。
赋初始值必须从参数列表的右边开始赋值
3.1.2inline内联函数
C89标准下C语言没有的函数。但类似于宏,只不过宏它是在预编译阶段展开,宏作为预处理并不进行类型检查
C++内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中,是在 编译阶段进行处理的。inline函数是要进行类型检查的。没有栈帧的开辟回退。一般写在头文件中。
3.1.3 函数重载
C不存在函数重载,因为C语言中产生函数符号的规则是根据名称产生
C++根据函数名参数个数参数类型判断重载,属于静多态,必须同一作用域下才叫重载。函数的返回值并不能作为函数重载的依据。
3.1.4const
C语言中被const修饰的变量不是常量,叫做常变量或者只读变量,这个常变量是无法当作数组下标的。
C++中const修饰的变量可以当作数组下标使用,成为了真正的常量。定义的时候必须初始化,可以用作数组的下标。也可以通过指针修改。
3.1.5引用
C语言中:兄弟:指针传址
指针可以为空
可以改变指向,而指向其它对象
指针是指针本身的大小,4个字节。
C++中:是原变量的一个别名。
引用底层就是指针,使用时会直接解引用,可以配合const对一个立即数进行引用。
引用不可以为空
不可以改变指向
引用的大小是所指向的变量的大小,因为引用只是一个别名而已
3.1.6malloc,free && new,delete
malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数
new和delete是C++运算符、关键字。new和delete底层其实还是调用了malloc和free
malloc在分配内存前需要大小,还需要类型转换
int *p1 = (int *)malloc(sizeof(int));
new不需要,因为它可以从给出的类型判断,并且还可以同时赋初始值。
int *p2 = new int;
//int *p3 = new int(10);
malloc不安全,需要手动类型转换
new不需要类型转换。
free只释放空间
delete先调用析构函数再释放空间(如果需要
new是先调用构造函数再申请空间(如果需要
malloc失败返回0
malloc开辟在堆区
new可以调用malloc()
new失败抛出bad_alloc异常。
new开辟在自由存储区域
malloc不能调用new
3.1.7作用域
作用域只有两个:局部,全局
C语言中没有命名空间
C++中具有局部作用域,类作用域,名字空间作用域三种。
3.1.8C语言是面向过程语言,而C++是面向对象语言
面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。
C语言主要用于嵌入式领域,驱动开发等与硬件直接打交道的领域
面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
C++可以用于应用层开发,用户界面开发等于操作系统打交道的领域。
3.1.9输入与输出
cout代表C++的输出流
cin代表C++的输入流
它们都是在头文件“iostream”中定义。
“cout”必须与”<<”一起使用,“<<”起到插入的作用。
在一条语句中可以多次使用“<<”输出多个数据。
3.1.10返回值不同
C语言中,如果一个函数没有指定返回值类型,默认为int类型,并返回一个随机数,一般为0XCCCCCCCC。
在C++中,如果函数没有返回值则必须指定为void型,否则编译不能通过。