一直以来都在深入的linux底层,每天都在跟C语言打交道,甚至跟汇编语言打交道。这次跟同事合作开发一个演示项目。涉及到图形界面开发,以及到中间件开发(基于C )。自然而然C 是无法回避的。一开始面对C 代码,真不习惯。不像C语言,各个函数可以直接搜或者source insight关联函数调用之间关系。因为C 存在函数重载现象,按函数名搜出来的函数一大堆,最后还是要分析形参已经对象所在类来判断是调用哪个函数。
还好以前学校学过C 课程,虽然忘了细节,基本概念尚存,通过一段时间的学习和使用,总结心得如下:
C 三大特性:
1. 封装性
每一个类都在以XX.h 头文件形式封装。每个成员函数,在XX.cpp中实现各个成员函数。要弄清各个成员的访问权限或可见性很重要
2. 继承性
基类,派生类的之间层层继承,要搞起各个类之间的关系,以及对外的可见性
3. 多态性
这个东西很麻烦,现在总结一下,我在项目中遇到的重要的几个困惑
1.虚函数的作用:
某个一个家族类,如果其父类和子类都有某个函数f(),如果定义为虚函数的形式,调用时,调用的子类的函数(动态联编),否则调用父类函数。虚函数的引入是消除父子之间的同名函数的二义性,否则就要类名::四点来区分二义性,但不规范。(一般new一个对象,通过该对象指针来使用)
总之你看到一个函数,如果在该类实现,就调用该类,如果没有,肯定是在其父类已经实现了,可以追溯到其父父类
2.纯虚函数的作用
主要完成抽象与具体的关系
父类,只是一个抽象,以纯虚函数的形式来实现。而子类却根据具体情况,进行具体的实现。
比如一个求面积的实现
Class area
{
Public:
Virtual area(int x ,int y) =0;
}
Class square:public area
(
Int Area(int x, int y);
}
Class cycle: publicare
{
Int Area(int x,int y);
}
Int cycle:: Area(int x, int y)
{
Return pi*x*y; }
3.虚基类
类B 从类A中继承f()函数
类C 也从类A中继承f()函数
类E从类B和类C继承过来
那边类B,C在继承类A时以虚基类形式继承
那么在E类对象中无论怎样访问f()函数都不存在二义性
否则就要类符号::来区分,就不存在二义性,但加类符号::太麻烦,就采用虚基类直接完成
4.C 代码和C代码的相互调用
语言C 和C编译的链接的原理不一样,因此C 不能直接调用C,C也不能直接调用C 。因此要通过#ifdef __cplusplus extern C 关键词对 .h文件进行宏处理,告诉C 编译器对该头文件里面的函数按C来链接,而不是C 方式链接,这样对C代码和C 代码就进行了区分。
4.C 语言是面向过程的语言,在C语言中,一般关注的是程序执行流程。但在C 是面向对象语言,除了关心程序的流程,更多的还需要关注类与类直接的之间的关系,以及成员的可见性。