1.3 C/C++基础知识
C语言是当前最流行的程序设计语言之一,历经几十年不衰。它简单易学,表达力强,应用广泛,执行效率高。既有高级语言的特点,又具有低级语言的特点。C语言是计算机专业的必修课。
面向对象程序设计是二十年来流行的程序设计方法。面向对象程序具有封装、继承、多态的特点。将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。类通过一个简单的外部接口,与外界发生关系。对象与对象之间通过消息进行通信。通过类的继承关系,使公共的特征能够共享,提高了软件的重用性。继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。多态性描述的是同一个信息可根据发送信息对象的不同采用多种不同的行为方式。多态一般包括静态多态和动态多态。静态多态在编译时确定,通过使用重载来实现的,执行哪个重载版本在编译时知道;动态多态通过虚函数来实现的。
C++是在C语言的基础上发展起来的,对C语言进行了扩充,增加了面向对象程序设计的支持。其特点是既支持面向过程的程序设计,又支持面向对象的程序设计。
中国象棋程序设计重点在算法分析与数据结构设计,代码执行效率要求高,采用C/C++来实现最适合不过了。
C语言的基本语法在这就不多述了,想必读本书的读者都有C语言的基本功。根据笔者的经验,有必要在此将C语言中的复杂及重要的知识点再描述一番,有助于读者快速理解本书后面的内容。
1.3.1 结构体
结构体是一种构造数据类型,把不同类型的数据组合成一个整体。例如定义一个学生数据类型,
struct student { int num;
char name[20]; char sex; int age; float score; char addr[30]; };
Struct是定义结构体的关键字,student是结构体的名字。
结构体变量的说明有3种方法:
1. 用已定义的结构体类型名定义变量。
例如用上面的结构体类型定义变量:struct student s1,s2;
2. 在定义结构体类型的同时定义结构体变量。
struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }s1,s2;
3. 不定义结构体类型名,直接定义结构体变量。
struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }s1,s2;
在定义结构体时,另一种常见的方法是用typedef定义。
typedef struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }Stu;
Stu是一种数据类型,代表上面的自定义的结构体类型,而不是结构体变量。它用来定义结构体变量。
Stu s1,s2;
它与
struct student s1,s2;
是完全等效的。
1.3.2 联合体
联合体是使几个不同类型的变量共占一段内存(相互覆盖)。共用体类型的定义与结构体类型的定义类似,但所用关键字不同,共用体类型用关键字union定义。
union exam { char c; int a; float b; }x;
联合体内的三个变量在地址空间上以低地址对齐,联合体所占内存空间大小取决于最大的成员所占用的内存空间,如图1-4所示。
main() { union int_char { int i; char ch[2]; }x; x.i=24897; printf("i=%o\n",x.i); printf("ch0=%d,ch1=%d\n ch0=%c,ch1=%c\n", x.ch[0], x.ch[1], x.ch[0], x.ch[1]); }
图1-4 联合体示意图
运行结果:
i=60501 ch0=65,ch1=97 ch0=A,ch1=a
1.3.3 枚举
如果某个变量的值只为有限的几种可能,那最好将此变量定义为枚举变量。
enum ColorType{red,yellow,blue,white,black} color;
enum是定义枚举类型的关键字。
枚举值标识符是常量不是变量,系统自动给予它们0,1,2,3…值,因此枚举类型是基本数据类型。枚举值只能是一些标识符(字母开头,字母、数字和下画线组合),不能是基本类型常量。虽然它们有值0,1,2,3…,但如果这样定义类型enum ColorType {0,1,2,3,4};是错误的。
可在定义枚举类型时对枚举常量重新定义值,如:
enum color_name{red=3,yellow,blue,white=8,black};
此时yellow为4,blue为5,black为9,即系统自动往后延续。
枚举类型的数据就是用户定义的一组标识符(枚举常量)的序列,其存储的是整型数值,因此枚举类型是基本数据类型。由于枚举常量对应整数值,因此枚举类型数据与整数之间可以比较大小,枚举变量还可以进行++、-- 等运算。枚举类型不能直接输入输出,只能通过赋值取得枚举常量值,输出也只能间接进行。
1.3.4 指针
指针是C语言中变化最多,难度最大的内容,掌握得好会提高程序的效率,用得不好常常会造成很多意想不到的错误。在此总结一下与指针相关的数据类型,使读者对指针有一个快速的回忆,如表1-1所示。
表1-1 指针的数据类型
1.3.5 面向对象程序设计
面向过程的程序设计思想的核心是功能的分解。将数据结构和过程作为两个实体来看待,其着重点在于过程。面向过程的程序其可重用性差,维护代价高。
面向对象方法是以对象为中心的开发方法,它是从客观世界抽象出来的。面向对象方法有以下基本特征:封装、继承、多态。
所谓“封装”,就是用一个框架把数据和对数据的操作组合在一起,形成一个对象。遵循面向对象数据抽象的要求,一般数据都被封装起来,也就是外部不能直接访问对象的数据,外部能见到的只有提供给外面访问的公共操作(也称接口,对象之间联系的渠道)。在C++中,类是支持对象封装的工具,对象则是封装的基本单元。
封装的对象之间进行通信的一种机制叫做消息传递。消息是向对象发出的服务请求,是面向对象系统中对象之间交互的途径。消息包含要求接收对象去执行某些活动的信息,以及完成要求所需的其他信息(参数)。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。接收者接收了消息,它就承担了执行指定动作的责任,作为消息的答复,接收者将执行某个方法,来满足所接收的请求。
继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。一个基类可以有任意数目的派生类,从基类派生出的类还可以被派生,一群通过继承相联系的类就构成了类的树型层次结构。通过类的继承关系,使公共的特征能够共享,提高了软件的重用性。首先进行共同特性的设计,然后自顶向下来开发子类,逐步加入新内容,这符合逐步求精的软件工程的原则。继承便于实现多态性,便于系统的扩展。
多态性是对问题的面向对象方法中关键特征之一。多态性描述的是同一个信息可根据发送信息对象的不同采用多种不同的行为方式。C++支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态性是通过使用重载来实现的,执行哪个重载版本在编译时知道,因此是相对静态的多态性,而运行时的多态是通过虚函数来实现的。