一、C语言与C++的历史渊源
C语言来自:
Algol 60->
CPL->BCPL(B=basic)->B语言(世界上第一个操作系统UNIX的母语)->
C语言(BCPL第二个字母)->UNIX系统基于C语言的重写->
C++,在C语言的基础上发明的,进一步扩充和完善了C语言->
Java、C#,在C++的基础上改写产生的。
二、C++与C语言的区别
首先我们需要明白从C到C++到底扩充了什么。
刚开始学C++的时候,萌新们就被灌上面向对象的四字迷药,说C语言是面向过程的,而C++是面向对象的。这就很显然了,C++与C语言最大的区别就是,C++你要摆个对象在你面前,才能开始进行你的骚操作,所以要学习C++,你的首要任务就是——找对象。全篇终。
那么什么是面向过程呢?面向过程的方法其实与我们常人处理事务的思维类似:炒西红柿鸡蛋——准备材料、打火、下锅、翻炒、起锅完事。面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用即可。
那什么是面向对象呢?对象是什么?万物皆对象。什么,万物皆对象,你也太重口味了。一个人是一个对象,大到大象,小到蚂蚁,都是一个对象。你的基友小胖,你的女神小美,你的闺蜜小丽,你的上司小明等等,如果他们都是人的话,我们又可以把这些对象进行一个抽象,归个类,就叫作人。(我竟然举不出来例子,理解的不透彻)
C语言是结构化的面向过程的语言,它主要考虑的是如何通过一个过程,对输入进行运算,得到输出。
C++是面向对象的语言,C++首要考虑的是如何构造一个对象模型,让这个模型能够与要解决的问题相契合。
面向过程的编程方法有着更好的性能,但是代码不易维护、不易复用、不易拓展。
面向对象的编程方法易维护、易拓展、易复用,但是性能相对面向过程的方法要差一些。
啥?对象都有了,你还问我牺牲这点性能值不值得?
在程序规模较小的时候,C语言能够轻松应对,但是当程序的规模比较大的时候,C语言就很难受了。
我个人觉得C语言和C++的绝大部分的区别都是由这两种不同的编程思想衍生出来的,C++添加或修改的新特性、语法规则和关键字都是为有对象的程序服务。
2.1 C++对封装、继承、多态的支持
2.1.1 封装——类
封装就是,把之前我们说的小胖、小丽、小明等的各种属性来个并集,也即人的特性抽象出来,形成人这一个类,他们的大脸、尖脸、大头、小头等视为各自的固有属性,爱装x的小明的有特有的装x行为,爱打球的小胖有灵活的脚步行为等等。把这些属性和行为进行有机的结合,形成了一个通用类——人。
在C++中,将对象进行抽象,定义其统一的属性和方法,形成一类,即完成了所谓的封装。
封装的目的在于将对象的使用者和设计者分开,利用接口的机制隐蔽内部的实现细节,只留下接口给外接调用。封装的设计可以提高软件的可维护性和可修改性,还可以实现代码重用。
2.1.2 继承
继承就是从已有类那里得到已有的属性和方法。比如有个手机类,然后这么多的牌子,那肯定要再手机类的基础上再进行细分。手机类作为基类,苹果手机、华为手机、三星手机等继承手机类,在手机类的基础上,发展他们自己的特色。
同样的在C++中使用继承,可以使代码得到重用,子类也可在父类的基础上添加功能。
2.1.3 多态
多态的方式有两种:静态多态、动态多态。
其中静态多态是编译器在编译期间完成的,包括函数重载和泛型编程。
函数存在重载情况时,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,如果没有就报错了。
//add.cpp
int Add(const int left,const int right){
return left+right;
}
char Add(const char left,const char right){
return left+right;
}
float Add(const float left,const float right){
return left+right;
}
而重载存在一些问题:(1)重载不能解决所有函数的适应情况;(2)重载存在很多的重复代码,代码的复用率不高;
C语言中也有一个解决方式就是宏定义,但是宏定义没有类型检测,代码的安全性不高,且宏不是函数,无法调试,如果在调用宏的语句中出现错误时,非常麻烦。
//Macro.cpp
#define Add(a,b) ((a)+(b))
那C++还有一种静态多态的编程方式就叫做泛型编程。模板是泛型编程的基础,模板又分为函数模板和类模板。下面的代码展示的是一个函数模板,它的类型是T,在调用时,会检查输入实参的类型,检查的过程称作模板实参推演,推演可以决定T的实际类型,从而进行后续的处理。
//template.cpp
template<typename T>
T Add(const T& left,const T& right){
return left+right;
}
之后会单独开出一小节来具体介绍泛型编程。
接下来介绍一下动态多态。它是在程序运行时,根据基类的指针指向的具体对象来确定具体应该调用哪个类的函数。动态多态的实现核心是虚函数,当然也肯定要拜继承所赐。
同样的,之后会单独开出一个小节来介绍基于虚函数的多态实现。
2.1.4总结
C++添加了类、类的继承、泛型编程、虚函数等机制来完成对封装、继承、多态支持,以实现面向对象的编程方法,这些都是C语言所没有的。
2.2 C++中独有的关键字
2.2.1 标准输入输出
在C语言中,输入输出是使用语句scanf()和printf()来实现的,而在C++中是使用类来实现的。
2.2.2 强制类型转换
2.2.3 动态分配内存
参考资料:
C语言的发展
面向过程——百度百科
面向对象——百度百科
C++与C语言的区别
鸵鸟不是鸟,圆不是椭圆问题
多态
静态多态——泛型编程