前言
一、 为什么编写这本书
毋庸置疑,C++语言是当前非常流行的面向对象程序设计语言,各高等院校的计算机专业都开设了C++语言课程,作为面向对象程序设计的入门课程,有些学校甚至把C++语言课程作为非计算机专业学生的公共课。
然而,不可否认的是,C++语言语法复杂,想要轻松学习并熟练掌握C++语言的精髓绝非易事。目前,介绍C++语言的书数不胜数,这些书要么篇幅过大,要么内容比较具体、深入。当然,适合初学者的书也比较多,其中也不乏优秀的书。
但是,笔者依然耗费巨大的精力编写本书。笔者多年来一直从事一线教学工作,有着多年讲授C语言和C++语言的经验,知道学生学习C++语言的主要障碍是什么,哪些问题对他们来说是难以理解的,哪些问题是相对比较容易的。笔者一直尝试站在学生的角度看C++语言到底是什么,如何以学生的思维理解一个语法知识点。这也是编写本书的出发点。本书力求做到深入浅出,通过大量的示例把复杂的概念用浅显的语言介绍给读者。
二、 如何使用这本书
本书主要面向高等院校计算机专业的学生,使用本书时要注意以下几点。
(1) 需要有C语言编程基础。严格来说,本书并不是一部完整的C++程序设计语言教程,因为本书省略了一些关于C++语言的基本语法方面的内容,如基本数据类型(int、char、float、double等)、程序控制结构(顺序结构、分支结构和循环结构)、数组、指针、结构体、自定义函数等。C++语言是在C语言基础上发展起来的,它兼容C语言,有许多语法与C语言语法是相同的。因此,笔者建议读者要有一定的C语言编程基础。(2) 突出本书的基础性作用。通常,C++语言是学生接触的第一门面向对象程序设计语言,他们缺乏程序设计的实际经验,而且没有学习数据结构、算法等相关课程。所以,目前他们很难用C++语言编写出实用的应用程序。本书以大量的、简单的控制台应用程序演示C++语言语法及功能,通俗化地介绍面向对象程序设计中晦涩的、难以理解的概念,希望读者不要厌烦这些看似简单、没有任何用处的示例。事实上,每个示例都是笔者精心设计的、具有代表性的,能够深刻剖析C++语言的每个语法细节。但是,笔者始终坚持一个观点: 学习C++语言时绝不能沉陷于C++语言的语法细节的汪洋大海中,因为C++语言的语法太过复杂,如果拘泥于语法细节的实现,往往只会使读者深切地感到C++语言语法的枯燥,无法从更高的角度高屋建瓴地理解面向对象程序设计的概念及编程理念。而建立正确的面向对象程序设计的理念及程序设计方法是学习C++语言的一个最主要目的。
(3) 切忌眼高手低。学好C++语言通常需要经过三个阶段: 首先是模仿阶段。多读别人写的代码,不断揣摩编程者的心思,试图做到与编程者的心灵相通,彻底理解代码的功能及设计思路。其次是质疑阶段。质疑别人写的任何代码,力图从另外一个角度找到解决问题的方法,做到以更简洁、易懂的代码解决相同的问题。但是,这个阶段编写的代码往往经不起推敲。最后是自由发挥阶段。对于任何问题总能找到最恰当的算法,编写出无懈可击的、健壮的代码。笔者在教学过程中发现,有些学生编写代码的思路很“奇特”,代码虽然简单却不容易理解。而这些学生往往很欣赏自己的“杰作”,俨然把自己当作了“编程达人”。事实上,思路“奇特”、可读性差的代码并不是好的代码,这些代码中往往存在设计漏洞,经不起推敲。所以,在使用本书的过程中,笔者建议读者放下“身段”,把每个示例都读一遍、写一遍、改一遍。读懂笔者的心思,看懂示例代码,然后亲自编写一遍代码,力求做到仿而不抄。最后修改代码,达到“青出于蓝而胜于蓝”的效果。
笔者很喜欢网上看到的一段话,大概意思是: 我知道打基础是痛苦而且没有多少成就感的过程,但是在化茧成蝶之前,我们还是要继续做而且要认真地做“毛毛虫”,因为我们知道我们会有变成美丽蝴蝶的那一天!以此与读者共勉。
三、 本书各章内容介绍
本书内容共分为10章,包括初识C++、预备知识、类与对象、运算符重载、类继承、多态、模板、标准模板库、输入/输出流、异常与断言。
第1章主要介绍C++语言的发展、特点及应用领域;C++语言程序设计基本过程、程序基本结构、名称空间、常用编译器等;Code::Blocks集成开发环境,在Code::Blocks中设计C++语言控制台应用程序的基本方法及过程。
第2章主要介绍C++语言不同于C语言的数据类型、变量声明及初始化方法,包括布尔类型、类型转换、自动类型声明及变量的列表初始化;数组的另外三种实现方法: vector、array和string字符串;使用new和delete运算符申请内存及回收内存,引用与指针的联系与区别,左值引用与右值引用,内联函数、默认参数函数及函数重载的概念及作用等。
第3章主要介绍面向对象程序设计的概念及程序设计理念,类的声明、对象定义、构造函数、析构函数等,类中成员的访问方式,类的封装性的意义,类中特殊成员(如静态成员、常成员等)的作用及使用方式,类的友元的作用及使用注意事项。
第4章主要介绍运算符重载的概念、意义,常用运算符在自定义类中的重载规则、重载方式,类型转换函数及类型转换构造函数等。
第5章主要介绍类的继承,包括程序设计中代码重用的意义、不同继承方式下类中成员的访问方式、多重继承等。
第6章主要介绍多态,包括静态多态性及动态多态性、基类与派生类之间的类型转换、虚函数与动态多态性的实现、纯虚函数与抽象类等。
第7章主要介绍程序设计中的代码重用和范型编程的概念及意义,包括函数模板的功能及使用方法、类模板的功能及使用方法、函数模板及类模板的实例化、可变参数函数模板等。
第8章主要介绍标准模板库(Standard Template Library,STL),STL主要包含容器、迭代器、算法、函数对象等。本章内容包括序列容器(vector、deque、list)及容器适配器(stack、queue)、关联容器(set、map等)、迭代器(迭代器的类型及作用)、算法(STL中常用的算法,如find、sort、for_each等)及函数对象的使用方法。
第9章主要介绍输入/输出流的概念、C++中标准流类库、标准输入流(istream)、标准输出流(ostream)、数据输入/输出的方法及格式化控制、文件流类、文件流对象的创建、文件的打开与关闭、文本文件及二进制文件的读/写方法、字符串流的概念及使用方法等。
第10章主要介绍程序设计过程中的异常处理,包括异常的概念、异常处理的机制、异常类、断言及静态断言等。
四、 致谢
首先感谢山东省教育服务新旧动能转换专业对接产业项目(曲阜师范大学精品旅游)对本书的资助。
笔者在编写本书的过程中得到了很多领导和教师的指导与帮助,也得到了父母、爱人、孩子的大力支持,没有他们的帮助,笔者很难完成书稿。
感谢禹继国教授、赵景秀教授,他们为本书稿提出了一些很有见地的指导意见。感谢清华大学出版社编辑的帮助。
感谢所有参与书稿编写的教师,主要参编人员有黄万丽、马春梅、闫超、张秀娟、司广涛、刘金星、崔新春、任平红等,全体人员在编写过程中付出了辛勤的汗水,在此一并表示感谢!
尽管我们付出了最大的努力,但是由于知识水平及能力有限,书中难免有不妥之处。真诚地希望各位专家及读者朋友提出宝贵意见,我们将不胜感激。

编者2019年7月于曲阜师范大学