C++从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

前 言

“从入门到精通”系列是专为初学者量身打造的一套编程学习用书,由知名计算机图书策划机构“龙马高新教育”精心策划而成。

本书主要面向C++初学者和爱好者,旨在帮助读者掌握C++基础知识、了解开发技巧并积累一定的项目实战经验。当读者系统地学习完本书内容之后,就可以骄傲地宣布—“我是一名真正的C++程序员了!”。

为什么要写这样一本书

荀子曰:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。

实践对于学习的重要性由此可见一斑。纵观当前编程图书市场,理论知识与实践经验的脱节,是很多C++图书的写照。为了杜绝这一现象,本书立足于实战,从项目开发的实际需求入手,将理论知识与实际应用相结合。目标就是让初学者能够快速成长为初级程序员,并拥有一定的项目开发经验,从而在职场中拥有一个高起点。

C++的最佳学习路线

本书总结了作者多年的教学实践经验,为读者设计了最佳的学习路线。

本书特色

▲ 零基础、入门级的讲解

无论读者是否从事计算机相关行业,是否接触过C++,是否使用C++开发过项目,都能从本书中找到最佳起点。

▲ 超多、实用、专业的范例和项目

本书结合实际工作中的范例,逐一讲解C++的各种知识和技术。最后,还以实际开发项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。

▲ 随时检测自己的学习成果

每章首页罗列了“本章要点”,以便读者明确学习方向。每章最后的“实战练习”则根据所在章的知识点精心设计而成,读者可以随时自我检测,巩固所学知识。

▲ 细致入微、贴心提示

本书在讲解过程中使用了“提示”、“注意”、 “技巧”等小栏目,帮助读者在学习过程中更清楚地理解基本概念、掌握相关操作,并轻松获取实战技巧。

超值光盘

▲ 18小时全程同步教学录像

涵盖本书所有知识点,详细讲解每个范例及项目的开发过程及关键点。帮助读者更轻松地掌握书中所有的C++程序设计知识。

▲ 超多王牌资源大放送

赠送大量王牌资源,包括18小时Oracle项目实战教学录像、118页库函数查询手册、19页C++常用查询手册、10套超值完整源代码、50个C++常见面试题及解析电子书、30个C++常见错误及解决方案电子书、51个C++高效编程技巧、C++程序员职业规划、C++程序员面试技巧等。

读者对象

▲ 没有任何C++基础的初学者

▲ 有一定的C++基础,想精通C++的人员

▲ 有一定的C++基础,缺乏C++实战经验的人员

▲ 大专院校及培训学校的老师和学生

光盘使用说明

01. 光盘运行后首先播放片头动画,之后进入光盘的主界面。其中包括【课堂再现】、【Oracle项目实战教学录像】两个学习通道,和【范例源码】、【实战练习答案】、【赠送资源】、【帮助文件】、【退出光盘】五个功能按钮。

02. 单击【课堂再现】按钮,进入多媒体同步教学录像界面。在左侧的章号按钮上单击鼠标左键,在弹出的快捷菜单上单击要播放的节名,即可开始播放相应的教学录像。

03. 单击【Oracle项目实战教学录像】按钮,打开教学录像文件夹,在其子文件夹中选择要播放的视频文件,即可播放录像。

04. 单击【范例源码】按钮,可打开本书范例源码文件夹。

05. 单击【实战练习答案】按钮,可在打开的文件夹中看到实战练习答案。

06. 单击【赠送资源】按钮可以查看随本书赠送的资源。

07. 单击【帮助文件】按钮,可以打开“光盘使用说明.pdf”文档,该说明文档详细介绍了光盘在电脑上的运行环境及运行方法等。

08. 单击【退出光盘】按钮,即可退出本光盘系统。

网站支持

更多学习资料,请访问www.51pcbook.cn。

创作团队

本书由龙马高新教育策划,河南工业大学谭玉波任主编,河南工业大学王锋、张浩军、王宏勇任副主编。其中河南工业大学张浩军负责编写第0~1章,周德祥负责编写第2~3章,王锋负责编写第4~6章,王宏勇负责编写第7~9章,王献荣负责编写第10~12章,张春燕负责编写第13~15章,胡江汇负责编写第16~18章,谭玉波负责编写第19~23章以及附录部分。参加资料整理工作的人员还有高鹏飞、王润芝、白明亮、张学配、王亚兵、孔万里、李震、赵源源、乔娜、周奎奎、王果、陈小杰、左琨、邓艳丽、崔姝怡、侯蕾、左花苹、刘锦源、普宁、王常吉、师鸣若、钟宏伟、陈川、刘子威、徐永俊、朱涛和张允等。

在编写过程中,我们竭尽所能地将最准确的C++理解和感悟呈现给读者,但也难免有疏漏和不妥之处,敬请不吝指正。若您在学习过程中遇到困难或疑问,或有任何建议,可发送电子邮件至zhangyi@ptpress.com.cn。

编者

第0章关于C++—C++程序设计入门

本章视频教学录像:21分钟

C++作为一种面向对象程序设计的首选语言,吸引了许许多多的编程学习者。掌握C++编程,理论上可以实现任何系统。本章将带领初学者认识C++的编程世界,了解C++的起源。

本章要点(已掌握的在方框中打钩)

□ C++概述

□ 结构化程序设计

□ 面向对象程序设计

□ C与C++的区别

0.1 C++概述

本节视频教学录像: 12分钟

C++语言是当今应用最广泛的面向对象程序设计的语言,它包括C的全部特征、属性和优点。同时,增加了对面向对象编程的完全支持。目前,面向对象程序设计的语言很多,如Smalltalk、Java、Visual Basic、C++等。其中,核心的C++语言是当前最流行和实用的程序设计语言之一。

0.1.1 C++能做什么

C++涉及的领域很多,从大型的项目工程到小型的应用程序,C++都可以开发,例如操作系统、大部分游戏、图形图像处理、科学计算、嵌入式系统、驱动程序、没有界面或只有简单界面的服务程序、军工、工业实时监控软件系统、虚拟机、高端服务器程序、语音识别处理等。可以说,掌握了C++就掌握了整个软件工业的开发。

C++的优点吸引了很多程序将其作为开发的语言,用C++开发的优秀作品数不胜数。下面列出一些著名的用C++编写的软件产品。

1. 办公应用

Microsoft公司的Office系列软件。

2. 图像处理

Adobe公司的所有主要应用程序都是使用C++开发而成的,图像处理利器Photoshop就是其中之一,如图所示。

3. 网络应用

例如,百度网站的Web搜索引擎。

4. 网络即时通信

例如,目前国内使用最广泛的聊天软件之一 — QQ。

5. 手机操作系统

之前在智能手机中应用最广泛的Symbian操作系统也是用C++编写的。

6. 游戏开发方面

由于C++在工程性、运行效率及维护性上都有很大优势,所以大部分网络游戏和单机游戏都是用C++编写的。单机版的游戏,例如Windows自带的游戏都是采用C++编写。网络游戏方面,如腾讯公司的大部分QQ游戏也采用C++编写。下图是一款QQ游戏的界面。

0.1.2 C++的由来

C++语言起源于C语言,是在C语言的基础上增加了面向对象程序设计的要素而发展起来的。

1979年,Bjarne Stroustrup在Bell实验室,开始从事将C改良为带类的C(C with classes)的工作,并于1983年将该语言正式命名为C++。

20世纪90年代,程序员开始慢慢从C中淡出,转入C++。此后,C++稳步发展,1998年ISO/ANSI C++标准正式制定。

此后,经过不断的改进,发展成为今天的C++。相对于C语言来说C++语言引入了两个新方面:其一,就是面向对象(具体来说就是类);其二,就是模板技术。模板是C++中比较复杂的部分,但是对于一个真正的C++程序员,这部分很重要,尤其是对C++标准程序库的掌握尤为重要。

提示

C++源于C语言,但并不是简单地在C的基础上加上类而已,如果这样认为,读者是学不好C++的。读者应该把C++当做一门新语言来学习。

0.1.3 C++的特点

C++语言是当今应用最广泛的面向对象的程序设计语言之一,因此具有面向对象程序设计的特点。C++的主要特点如下。

1. 封装性

封装是把函数和数据封藏起来,把它看成一个整体。封装是面向对象的重要特征。首先它实现了数据隐藏,保护了对象的数据不被外界随意改变;其次它使对象成了相对独立的功能模块。对象好像是一个黑匣子,表示对象属性的数据和实现各个操作的代码都被封装在黑匣子里,从外面是看不见的。

更为形象的比喻,就像建造楼房需要设计人员、泥水匠、漆匠、水电工、监查人员、装修人员等不同工种的人来共同完成一样。在编程时,也需要不同“工种”的人。这里所谓“工种”就是能够完成某项工作的“类”,所谓“工人”就是类的对象。

C++通过建立类这个数据类型来支持封装性。使用对象时,只须知道它向外界提供的接口,而无须知道它的数据结构细节和实现操作的算法。

2. 继承性

通过上面的举例说明,所谓类不过是对一种“工种”的描述,而类的对象,就对应为担当这种“工种”的工人。接下来举另一种“工种”—— 教师来说明继承的概念。教师的工作是备课、上课、批作业、监考、改卷等,这些都是作为教师这个“类”的方法,而对于一位教师来说,教龄和执教年级也不同,所以这些就属于教师这个“类”的成员变量。

那么,假设现在有两位老师,一位张老师,一位赵老师,按以前的说法,这两位老师就是教师这一工种的对象,那么就应该是相同的。事实不是如此,因为张老师是语文老师,而赵老师是数学老师,二者自然有所不同。换言之,教师这个工种是一个大工种,还有更细的分工,就如上面所言的数学老师、语文老师、物理老师、化学老师等。所有老师共有的工作大家都有,只是实现方式上各有不同。在面向对象的语言里,也有对这种现象的模拟,叫作“继承”。

可以这样说,语文教师继承了教师,数学教师也继承了教师,两者既都继承了教师,都拥有教师该具备的素质(指能够备课、讲课等能力),又根据自身学科的不同而有所不同。

在C++里,可以把教师这个职业叫作基类,语文教师、数学教师等叫作派生类。从这个例子中很容易看出,基类拥有的是派生类共有的方法和属性,派生类则根据自身的特点对这些方法进行实现,对这些属性进行操作。

3. 多态性

继续以教师的例子来说明。对于学校来说,基本的物理单位就是教室,教室是教师用来上课的地方,可是教室没有规定具体哪一个老师才能来上课,对它来说,它只提供老师上课的地点,也就是说它只知道老师会来这里上课,具体谁来上,怎么上它并不关心。当然,虽然教室没有做硬性规定,学生们也不会担心,因为每个老师都知道自己该怎么上课。像这种情况,教室只要求了一个大工种(教师)的限制,而具体每个老师怎么上课则由老师自己的具体工种(语文老师还是数学老师)来决定。在C++里也有模拟,叫作多态。有了多态之后,在设计软件的时候,就可以从大的方向进行设计,而不必拘泥于细枝末节,因为具体怎么操作都由对象自己负责。

另外,C++的模板也是C++语言开发中比较重要的一部分,我们在后续章节会介绍。

0.2 程序设计概述

本节视频教学录像: 3分钟

程序设计是指设计、编制、调试程序的方法和过程。程序设计方法有两种,一种是结构化程序设计,另外一种是面向对象程序设计。

0.2.1 结构化程序设计

结构化程序设计的主要思想是功能分解并逐步求精。结构化程序设计方法是由E.Dijkstra等人于1972年提出来的,它建立在由Bohm、Jacopini证明的结构定理的基础上。结构定理指出:任何程序逻辑都可以用顺序、选择和循环等3种基本结构来表示,如图所示。

0.2.2 面向对象程序设计

与结构化程序设计相比,面向对象的程序设计更易于实现对现实世界的描述,因而得到了迅速发展,并对整个软件开发过程产生了深刻影响。面向对象程序设计的本质是把数据和处理数据的过程看成一个整体——对象。

也就是说,面向对象程序设计是以“对象”为中心进行分析和设计的,使这些对象形成了解决目标问题的基本构件,即解决从“做什么”到“怎么做”的问题。其解决过程是先将问题空间划分为一系列对象的集合,再将对象集合进行分类抽象,一些具有相同属性行为的对象被抽象为一个类,类还可抽象分为派生类。采用继承的方式实现基类和派生类之间的联系,形成结构层次。

0.3 C、C++与Visual C++

本节视频教学录像: 6分钟

可能许多初学者分不清C、C++与Visual C++之间的区别,本节将详细介绍这些基本概念之间的区别。

0.3.1 C与C++

C++从C进化而来,继承了其高效灵活性。虽然C++源于C语言,但并不是在C的基础上增加了类而已,如果这样认为,读者是学不好C++的。C++绝不单是C的升级或扩充。如果C++一开始被称作Z语言,大家一定不会把C和Z语言联系得那么紧密,因此,读者应该把C++当做一门新语言来学习。

下面是一个输出字符串的例子,分别用C语言和C++语言编写。

用C语言编写程序代码如下:

      /* 这是一个简单的C程序: simpIe.c */
      #incIude <stdio.h>                 //*包含标准的输入输出库*/
      void main()
      {
        printf("HeIIo WorId!\n");         //输出字符串
      }

用C++语言编写同样功能的程序代码如下:

      // 这是一个简单的C++程序:simpIe.cpp
      #incIude <iostream>               //包含标准库中的输入输出流头文件
      using namespace std;
      void main()
      {
        cout<<"HeIIo WorId!"<<endI;      //输出字符串
      }

C++程序与C程序的比较如下。

⑴ C++程序与C程序的结构完全相同。

⑵ C源程序文件的扩展名为.c,C++源程序文件的扩展名为.cpp。

⑶ C中的注释使用符号“/*”和“*/”,表示符号“/*”和“*/”之间的内容都是注释;C++除了支持这种注释,还提供了双斜线“//”注释符,“//”之后的本行内容是注释,注释在行尾自动结束。

⑷ C程序所包含的标准输入、输出的头文件是stdio.h,输入、输出通常通过调用函数来完成;而C++程序可以包含标准输入流、输出流的头文件iostream,输入、输出可以通过使用标准输入流、输出流对象来完成。

0.3.2 C++与Visual C++

Visual C++不是一门计算机语言,它是当今Windows操作系统下最流行的C++集成开发环境之一,是使用最广的C++编译器。目前常用的版本是Visual C++ 6.0。Visual C++编译器负责将C++源代码编译成汇编文件、转换为中间文件(.obj文件),然后使用连接器将相关的中间文件连接在一起,生成可执行的二进制文件(.exe文件)。其过程如下。

⑴ 源程序经过预处理后交给编译器。

⑵ 如果代码无误,编译器将代码生成汇编程序,再生成若干个目标程序。

⑶ 连接器负责对目标程序进行连接,生成可执行的程序。

0.3.1小节中的C++源程序在Visual C++ 6.0中经过以上处理过程后,会在命令行中输出如图所示的结果。

本书的程序实例均在Visual C++ 6.0编译器中调试通过。Visual C++ 6.0的操作会在本书第1章中具体讲解。读者需要在以后的学习中多用、多试、多思考,才能够熟练地掌握C++和Visual C++ 6.0。

0.3.3 C++初学者建议

对于初学者,我们不需要对学习C++望而生畏。其实,C++并没有什么特别难学的地方。它就是一门语言,我们把它当作一门语言来学,其实它是非常简单的。简单来说,是将一些符合C++程序设计的简单语句放在一起,实现一些比较复杂的程序过程。在学习C++时,我们应该做到如下几点。

⑴ 不要浮躁,要有一个平静的心。一开始学习的C++代码,它们的功能很简单,但是我们不要认为C++原来就只是干这么简单的事情,其实不是,这些只是用来练习。当你对所有的C++语法都熟练了,再运用你聪明的大脑,就可以做出复杂的程序。

⑵ 在开始阶段,看到代码就要模仿,不要偷懒。要把书上的程序例子亲手输入到计算机上实践,即使配套光盘中有源代码。

⑶ 学习编程的秘诀是:编程,编程,再编程。

⑷ 把在书中看到的有意义的例子扩充。

⑸ 不要放过任何一个看上去很简单的小编程问题—它们往往并不那么简单,或许可以引伸出很多知识点。

⑹ 别心急!设计C++的class确实不容易。自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的。

⑺ 请重视C++中的异常处理技术,并将其切实地运用到自己的程序中。

⑻ 经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去。

⑼ 热爱C++!