C++宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1部分 C++基础

第1章 走进C++

本章包括

◆ 从C到C++的发展历程

◆ 认识类与对象

◆ C++的应用现状及发展方向

◆ 面向过程和面向对象软件开发方法

◆ 面向对象编程的特点

◆ 学习C++的一般方法


C++是近年来最流行、最广泛使用的程序设计语言之一。C++是在C语言的基础上发展而来的,并实现了由面向过程到面向对象的转变,全面支持面向对象的程序设计方法。Java和C#等程序设计语言的出现与流行,并没有取代C++在软件行业中的领先地位。同时,C++自身也在不断完善,其未来发展方向也很明确,那就是作为高性能软件开发的基础,在平台软件开发中发挥主要作用。本章主要介绍C++语言的发展历程、类与对象的基本概念、面向对象编程的特点、C++的应用现状及发展方向,以及学习C++程序设计的一般方法。

1.1 初识C++

C++是由C语言发展而来的,与C语言完全兼容。C++在C语言语法的基础上进行了扩充,最主要的就是引入了类,增加了面向对象机制,如继承、派生、多态等,从而实现了由面向过程向面向对象的转变。

1.1.1 从C到C++

在C语言诞生以前,编写高效的系统软件主要采用汇编语言。用汇编语言编写的程序可直接编译为二进制码,不会像高级语言那样在编译过程中插入多余代码,其目标代码非常简洁、高效,对硬件的操控能力也很强。但是汇编语言过分依赖于计算机硬件,而不同CPU的汇编指令也不同,从而导致了汇编语言的可读性和可移植性都很差。

普通高级语言的可读性和可移植性虽然比汇编语言要好很多,但它又缺乏汇编语言那样的高效性和对底层硬件的强大操控能力。于是人们迫切需要一种中间语言,即一种介于汇编语言和高级语言之间的语言。这种语言既要有非常高的指令效率和强大的底层控制能力,又要具有高级语言的简洁性、易懂性和较好的可移植性。C语言就是这样一种语言。

C语言语法简洁灵活,程序书写自由,能够像汇编语言一样进行位、字节、地址操作,具有高级语言的简洁性,以及低级语言的高效性和对底层强大的控制能力;C语言具有丰富的运算符和数据结构,能实现各种复杂数据结构的操作运算;C语言引入了指针,使得程序能够直接访问物理内存地址,提高了程序的效率和灵活性。

20世纪80年代,科研人员发明了C++。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断地增加新特性。虚函数(virtual function)、操作符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI(Run-Time Type Identification)、名称空间(namespace)逐渐被加入标准。

刚诞生的C++和现在的版本有很大区别。首先,当时还没有真正的C++编译器,C++代码都是先转化为C代码,然后用C编译器编译的;其次,那时的C++没有继承,没有现在这么多关键字,也没有虚函数,虚函数是最后才被加入C++的主要特性。

C++经过了多次演变和修订,每次逐步增加一些新的关键字和新特性,最后才变成现在的样子。从C到C++语言的演化过程如图1-1所示。

图1-1 从C到C++语言的演化历程

提示

虽然C++与C语言有着很深的渊源,但C++并不依赖于C语言。读者在学习时可以完全不学C语言,而直接学习C++,在大多数场合下C++完全可以取代C语言。

1.1.2 从面向过程到面向对象

面向过程是一种以事件为中心的编程思想,面向对象是一种以事物为中心的编程思想。传统的面向过程软件开发方法存在着以下几个问题:

◆ 重用性差。

◆ 难以维护。

◆ 难以适应需求变化较大的情形。

开发大型软件系统经常面临的一个问题是需求模糊或需求变化较大。传统的面向过程软件开发方法很难适应这种情况,从而导致了软件开发周期长、成本高。

之所以面向过程的开发方法容易导致上述问题,主要是因为其主要手段是功能分解。首先从系统高层入手,自顶向下,不断地把复杂的处理分解为子过程,这样一层一层地分解下去,直到仅剩下若干个容易实现的子过程为止。然后用相应的工具来描述底层的各个过程。因此,面向过程的开发方法实际上建立在底层的各个过程上,如图1-2所示。

图1-2 面向过程的软件结构

用户需求的变化大部分是针对功能的,这种变化对于基于过程的设计是灾难性的,一旦中间某个过程出现变更,后续过程都必须做变更,这种变更的结果是软件质量得不到保障,软件也无法按时交付使用。所以用面向过程的开发方法设计出来的系统结构常常是不稳定的,用户需求的变化往往会造成系统结构的较大变化,从而需要花费很大代价才能实现这种变化。

提示

使用面向过程的方法开发的软件,当其底层的过程发生变化时,将影响到上层,原因就是其结构的层次性。这样带来的后果就是修改非常复杂。

面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是20世纪90年代至今软件开发的主流方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到了一个很宽的范围,如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。

面向对象是现实世界模型的自然延伸。现实世界中的任何实体都可以看做对象,对象之间通过消息相互作用。另外,现实世界中的任何实体都可归属于某类事物,任何对象都是某类事物的实例。如果说传统的面向过程的编程语言是以过程为中心、以算法为驱动的,面向对象的编程语言则是以对象为中心、以消息为驱动的。用公式表示,面向过程的编程语言为“程序=算法+数据”,面向对象的编程语言为“程序=对象+事件”。

1.1.3 认识类与对象

第一个面向对象的程序设计语言是Simula-67,它的出现是为了解决模拟问题。典型的模拟问题是银行出纳业务,包括出纳部门、顾客、业务、货币的单位等大量的“对象”。把那些在程序执行期间除了状态之外其他方面都一样的对象归纳在一起,就构成了对象的“类”,这就是“类”一词的来源。

提示

类与对象的关系,就是数据类型与变量的关系。实际上,类就是开发者自定义的数据类型,而对象就是该类型的变量。

类描述了一组有相同特性(数据元素)和相同行为(函数)的对象。之所以要用类,是因为基本的数据类型难以描述现实领域中的各种事物。使用类就可以将基本的数据类型组合成复杂的数据对象。面向对象技术能很容易地将大量问题归纳成为一个简单的解,这一发现导致了大量面向对象程序设计(Object Oriented Programming,简称OOP)语言的产生,其中最著名的是Smalltalk—C++之前最成功的OOP语言。

抽象数据类型的创建是面向对象程序设计中的一个基本概念。抽象数据类型几乎能像内部类型一样准确地工作。程序员可以创建该类型的变量并操纵这些变量。对象可以是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可以看做对象。对象不仅可以表示具体的事物,还可以表示抽象的规则、计划或事件。

例如,可以用一个对象来表示汽车。所有汽车都有这样一些属性,如颜色、车轮、引擎等。同时也有启动、停止、加速等一些动作。这样对象汽车就把它自己的一些共同属性(如颜色、轮子等)和方法(如启动、加速等)都组织在一起了,如图1-3所示。

图1-3 对象的属性和方法

面向对象编程用对象模拟实际事物,利用类把事物的属性和方法组织到一起,其中某一类的对象有一些共同特性和行为,这就是我们通常讲的封装。我们还可以利用继承关系从现有对象派生出新对象,并在新对象中增加独特的特性,实现对原有对象的扩充,如卡车类对象有汽车类的属性,但卡车的轮子数多、载重量大。

1.1.4 面向对象编程的特点

面向对象编程将对象的数据和方法封装成对象,对象的数据和方法是密切联系的。对象实现了信息隐藏,即在对象外部不能直接看到对象的数据和对象的方法是如何实现的。对象通过定义接口或者公有方法实现与外部通信,对象通常不知道其他对象的实现方法,因为实现细节隐藏在对象内部。就像我们可以很好地驾驶汽车而不需要知道发动机、传送系统和燃料系统内部如何工作一样,对象的使用者只需调用对象的接口,而不必关心具体的实现。

C++程序员需要重点考虑的是如何生成自己的用户自定义类型。每个类包含一组数据和一组操作数据的函数。类的数据组件称为数据成员,而类的函数组件称为成员函数。内部类型的实例称为变量,而用户自定义类型的实例称为对象。程序员用内部类型作为构造用户自定义类型的基本组件。C++中关注的重点是类而不是函数。系统中的名词帮助C++语言程序员确定组类,由这些类生成系统的对象。对象的类就像房子的蓝图,我们可以用一张蓝图建造多个房子,同样也可以用一个类生成多个对象。

说明

面向对象的思想已经涉及到软件开发的各个方面,如面向对象的分析(OOA,Object Oriented Analysis)、面向对象的设计(OOD,Object Oriented Design),以及我们经常说的面向对象的编程(OOP,Object Oriented Programming)。

1.2 C++的应用现状

现阶段,计算机程序设计语言种类繁多,比较流行的有C++,C#和Java。C#和Java由于晚于C++出现,对C++的不足之处进行了大量的改进,都很容易学习。采用C#和Java做项目开发的速度要比采用C++快很多,因此得到了大力的推广。但是,C++作为具有20多年历史的程序设计语言,有着大量的技术沉淀和大量的专业人才,这使得C++在现代软件领域中仍占据着举足轻重的地位。C++的应用领域如图1-4所示。

图1-4 C++的应用领域

C++对于现在OO(Object Oriented)思想的成熟以及在企业开发中的大量应用是功不可没的。但随着1995年网络时代的到来和Java语言的诞生,C++逐步进入了一个尴尬的境地。由于没有跨平台以及网络应用的优势,在企业级应用开发中C++逐步被Java所替代。

C#与Java由于在库的支持下大大简化了网络应用程序的开发,使得越来越多的人开始学习和使用C#与Java。但是C++在灵活性和效率方面仍然占有很大优势。在大型应用软件的开发过程中,一般底层开发优先选择C++,这样可以使得底层平台有很高的效率,同时具有很大的灵活性。另外,在软件拓展、移植和维护上C++也有很好的表现。

1.3 C++未来的发展

C++发源于C,自C++出现以来,在越来越多的场合逐渐取代了C语言的地位,取得了行业基础的地位。业界大量使用C++写成的产品代码以及大量的C++职业软件工程师就是最直接的证明。

C++在面向企业的软件开发中,在开发便捷性等方面的确要比C#和Java差很多,其中一个主要问题是C++语言没有强大的库的支持,而且由于C++很灵活,要用好C++需要长时间的积累,学习曲线比较陡峭。但是,C++在系统级复杂应用程序以及高性能、实时、并行和嵌入式领域占据着主导地位,同时在对灵活性和底层操作要求较高的软件开发中占据着绝对的优势。未来在一些由C或者C++开发的传统软件中,C++依然是开发者的首选。

1.4 如何学习C++

学习任何东西都必须从基础开始,但掌握C++语法只是迈出了学习C++的第一步。学习程序设计的一条最根本原则是“多练、多动手编写程序、多读源代码”。只有多编写代码才能达到熟练使用语言的目标,才能更深刻地理解语言的精髓。那么该怎样学习C++呢?

◆ 全面了解C++语言。

◆ 养成良好的编程习惯。

◆ 多写代码,多读代码。

◆ 坚持读C++方面的著作。

◆ 掌握C++基础后,尽量多参加C++项目。

◆ 开阔视野,广泛涉猎。

希望读者在自己的学习实践过程中注意上面几点。

1.5 小结

C++作为当今最流行的程序设计语言之一,在软件开发领域有着广泛的应用,从复杂的操作系统到大型应用程序,从数据库系统到网络应用,都有着C++活跃的身影,体现着C++不可替代的地位与作用。

C++语言灵活,对底层控制能力强,程序运行效率高,在保证程序的执行速度同时,也尽可能地节省了内存空间,能充分发挥计算机硬件的性能。C++全面支持面向对象程序设计方法,符合现代软件工程思想,从语言层面为面向对象的软件设计思想提供了强有力的保障。

学习C++不是一件容易的事情,希望读者能够循序渐进、脚踏实地地打好基础。学好程序设计的根本在于多加练习,同时勤动手、多动脑也能够激发我们的学习热情。C++的学习资源非常丰富,读者一定要好好利用这些资源。只要坚持,就一定能够收获成功,一定能够在软件设计领域大展身手,让C++为我们各自的专业领域服务。