零基础学C++(第3版)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-26 09:37:10

点击下载

作者:王慧,王浩

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

零基础学C++(第3版)

零基础学C++(第3版)试读:

前言

欢迎进入C++语言的世界!虽然说C++语言是在C语言的基础上发展而来的,但不同于C语言的面向结构编程机制,C++语言引入了面向对象编程和泛型编程机制。因此,完全可以把C++语言当成一门全新的语言来看。本书并不要求读者有C语言的基础。

为了使读者能循序渐进地掌握C++语言的语法机制和编程思想,笔者精心编写了本书。根据读者一般的学习习惯,以循序渐进的方式,从最简单的“Hello,World”程序开始,逐步深化、细化,对书中每个知识和技术要点都给出了详细的程序示例及代码分析。这些示例代码不仅一针见血地指明了技术要点的本质,而且短小精炼,方便复制和试验。

本书特色

本书合理控制了知识点的深度和讲解的进度,向读者展示出C++语言全貌。书中所给示例代码条理清晰,简洁且直透本质,读者可以迅速了解技术要点的内涵。笔者从事多年项目开发,经验丰富,本书面向初、中级读者,以大量的示例进行示范和解说,对技术要点的阐述深入浅出,其特点主要体现在以下几个方面。

·本书采用循序渐进的方式,每章主题鲜明,要点突出,适合初级、中级学者逐步掌握C++语言的语法规则和编程思想。

·本书范例丰富,包含几百个代码示例,关键知识点都辅以示例帮助读者理解。范例程序简洁,不是简单的代码罗列,而是采用短小精练的代码紧扣所讲的技术细节,并配以详细的代码解释和说明,使读者印象深刻。

·本书内容全面,兼顾了C++语言所有的特性。

·本书所有示例都具有代表性,揭示技术要点的本质,每个示例集中说明一个概念或要点。

·本书对于学习中经常遇到的问题与需要注意的关键点进行特别注释。

·本书大量使用了图例、表格等直观的表达方式。

·本书采用技术要点、详细介绍、示例运行等多种方式进行讲解,系统性和可用性强,能够给读者留下深刻的印象。

·本书精选习题,为了给读者在学习知识之余提供更多的实践机会,每一章都配了各种类型的习题。习题紧扣本章知识点,突出对知识的理解和应用。同时,在习题中还有上机操作题,结合本章的重点来考查,给读者应用所学知识提供机会。

·本书紧扣职场,为了给有可能参加职场面试的朋友提供更多的帮助,在本书最后一章专门提供了常见面试题。精选了多年来著名IT公司面试题中与C++语言相关的题目,除了提供最佳答案之外,还对题目进行了深入浅出的分析,帮助读者了解题目特点,把握面试重点。

本书内容

本书共分为六篇,共20章。

第一篇(第1~2章)是C++基础,涉及程序设计语言的基本概念,Visual C++6开发环境的搭建,C++程序的构成、变量、常量、运算符与表达式、数据类型转换以及流程控制语句等内容。

第二篇(第3~7章)介绍面向过程的C++程序开发,分别介绍数组和字符串、指针和引用,以及结构、共用体和链表的使用,详细地讲述了函数的使用,讨论了变量的类型、生存期、作用域和可见域,总结了在编写函数时经常出现的问题,提供了进行函数编写的建议。

第三篇(第8~11章)介绍面向对象(OOP)的C++语言程序开发,结合精练的代码讲述了类的设计和使用、多态、虚函数、继承、代码复用、友元等内容,向读者展示了C++语言面向对象编程的全貌和独特魅力。

第四篇(第12~13章)介绍泛型编程,这是由模板来实现的,使数据结构和算法的定义可以脱离具体类型的限制。C++提供了标准模板库STL,它是该篇的重点。

第五篇(第14~18章)介绍文件存储和编程规范方面的内容,文件存储从基本的高层I/O机制讲起,然后介绍C++流类库的使用、异常与错误机制、程序编码风格和C++程序编译相关的内容。

第六篇(第19~20章)首先用C++语言开发了一个简单的教学管理系统,让读者学以致用。然后讲解面试题精选方面的内容,介绍著名的IT公司关于C++语言程序开发方面的各种常见面试题,帮助读者提高笔试能力,找到满意的工作。

本书读者

本书作为C++语言的基础教程,适合于:

·C++语言的初学者。

·想从C语言跨越到C++语言的人员。

·了解C++语言,但所学不全面的人员。

·想了解C++语言技术及最新进展的其他人员。

·高等院校理科学习C++课程的学生。

·使用C++语言进行毕业设计的学生。

·使用C++语言进行项目开发的人员。

·掌握C++语言编程技术,想通过此找工作的人员。

本书作者

本书第1~10章由平顶山学院的王慧编写,第11~20章由王浩编写,其他参与编写和资料整理的人员有冯华君、刘博、刘燕、叶青、张军、张立娟、张艺、彭涛、徐磊、戎伟、朱毅、李佳、李玉涵、杨利润、杨春娇、武鹏、潘中强、王丹、王宁、王西莉、石淑珍、程彩红、邵毅、郑丹丹、郑海平、顾旭光。作者  第一篇C++基础第1章 C++概述

21世纪是个信息爆炸的时代,信息技术的发展日新月异,极大地改变了人们的沟通方式和生活方式。这些都是由不同的软件来完成的,这些软件称为计算机程序。有了程序,计算机才能为人类工作,没有软件的计算机是废铁一堆。我们可以从商场里或网络上方便地得到各种软件,如用来编辑文章的字处理软件,用来合理组织数据的数据库软件,学习英语的软件,供人娱乐的游戏软件等,这些软件都是通过计算机程序设计语言编写的。本书介绍的C++语言就是一门功能强大的程序设计语言,掌握了C++语言,我们便可以根据需要编写自己的软件。

对大多数人来说,计算机已经不是什么新鲜事物,花大力气讲计算机的详细结构似乎没有必要,但为了让读者能对计算机程序开发过程有总体认识,先简要介绍计算机的组成、原理及计算机语言的一些基本概念。

本章主要涉及以下知识点。

·计算机组成:介绍计算机组成的相关知识。

·程序设计语言:介绍程序设计语言的分类。

·C++程序设计语言:介绍关于C++语言的基础知识。

·开发环境搭建:通过图片和文字介绍如何搭建Visual C++开发环境。

·实例讲解:通过一个实例程序让读者认识C++语言程序设计。

·C语言与C++语言:分析两者的不同。1.1 了解计算机

通俗地讲,计算机是个“超级工具”,是一个能执行命令的电子设备。几乎所有的计算机都遵循冯·诺伊曼的“存储——运行”结构,它有以下基本功能:输入、输出、存储、执行算术和逻辑运算。计算机主要由硬件和软件两大部分组成,首先看什么是硬件。注意 硬件相当于人类的身体,而软件相当于人类的思想。1.1.1 计算机硬件

计算机的硬件主要有中央处理器(Central Processing Unit,CPU)、内存(或称主存、随机处理器、RAM——Random Access Memory)、输入/输出设备(Input/Output Devices)和外部存储设备(Secondary Storage,多数为具备海量存储能力的硬盘)。图1-1说明了计算机的硬件结构。图1-1 计算机硬件结构图(1)中央处理器

如果把计算机比喻成一个人,那么,中央处理器就相当于人的大脑,是整个计算机的控制中心。中央处理器由以下几部分组成:控制单元(Central Unit,CU)、程序计数器(Program Counter,PC)、指令寄存器(Instruction Register,IR)、算术逻辑单元(Algorithm Logic Unit,ALU)和累加器(Accumulator,ACC)。这几个部分相互配合完成程序指令的执行。

·控制单元主要有3个作用:获取并解释指令、控制数据或指令信息在内存中的读取、控制中央处理器内部各单元的工作。

·程序计数器用来记录下一步要执行指令的位置。

·指令寄存器用来暂存当前正在执行的指令。

·算术逻辑单元执行所有的算术和逻辑运算。

·累加器用来存储算术逻辑单元的计算结果。(2)内存

程序在执行前都要被装载到内存中,才能被中央处理器执行。以Windows系统为例,执行硬盘上的某个程序,实际上是将该程序的指令和数据导入内存,供中央处理器执行的过程。

内存是由按顺序编号的一系列存储单元组成的。在内存中,每个存储单元都有唯一的地址,通过地址可以方便地在内存单元中存取信息。内存中的数据要靠供电来维持,当计算机关机或意外断电时,内存中的所有数据就永久地消失了。(3)输入/输出设备

输入/输出设备是计算机与人交流的接口。负责读入指令和数据的设备称为输入设备,如键盘和鼠标;负责显示计算结果的设备是输出设备,如显示器和打印机。这里要特别说明的是外部存储器,它既可以将指令和数据送入中央处理器,又可以存储计算结果,所以,外部存储器既是输入设备,又是输出设备。(4)外部存储器

程序的指令和数据要装入内存才能执行,但内存中的数据在断电或关机后就丢失了。为了长久保存有用的指令和数据,需要一个不依赖于供电、能“永久性”存储数据的设备,我们把它称为外部存储器。典型的外部存储器包括硬盘、软盘、ZIP盘、光盘和磁带等。1.1.2 计算机软件

软件是能完成特定功能的程序,大体上可以分为两类:系统软件和应用软件。(1)系统软件

系统软件是用来控制计算机,管理计算机上的资源,使计算机的硬件有效发挥作用的程序。在系统启动时装载入内存的程序集合称为操作系统。没有操作系统的计算机什么也干不了。操作系统除了进行内存管理、文件管理和输入输出管理外,一般都提供了很多系统级的服务供用户调用。但不要认为操作系统程序有多么的高深莫测,从本质上说,它也是用程序设计语言编写出来的。只要掌握了程序设计的原理和硬件系统的相关知识,就可以编写出自己的操作系统。除了操作系统外,设备驱动程序和其他一些管理软件也可以归入系统软件的范畴。(2)应用软件

虽然系统软件能有效实现计算机的内部功能,协助计算机使用外围设备,但它没有把计算机转化成可以写报告、练打字、看电影等多用途的机器。想要实现这些功能,需要安装应用软件。应用软件面向特定的应用,如用Word软件来处理文字,用Excel软件来记录数据,还有供娱乐的游戏程序等。注意 对计算机而言,所有的软件都是由程序设计语言编写的,但是应用软件要在操作系统软件的支持下才能运行。1.2 程序设计语言

在人类的交流中,语言的作用无可取代,要想交流通畅,有共同的语言是首要条件。例如,一个中国人想和一个英国人聊天,光靠比划手势是不行的。有两种方法可以选择,要么学习英语,要么找一个翻译。计算机程序设计同样如此,计算机是无生命、无知觉的机器,它不懂人类的语言,不管是汉语还是英语,计算机都不会接受。人类要想与计算机交流,让其完成特定的任务,就必须解决“语言”的问题。人类和计算机交流同样有两条路:要么学习机器语言,要么找一个“翻译”。机器语言是什么?“翻译”又是什么?下面将给出解答。1.2.1 机器语言

计算机是一种电子设备,计算机处理的是数字信号。数字信号采用0和1记录信息,那么,计算机的语言——机器语言(Machine Language),自然也就是0和1序列。数字0和1称为二进制数据(Binary Digit),或者称为位(bit),这种由0和1组成的序列就称为二进制代码。注意 二进制代码只能由0和1组成。

即便是完成相近的功能,不同的计算机的设计者也可能会采用不同的二进制代码集来表示程序指令。换句话说,不同的计算机使用的机器语言并不一定相同。不过可以肯定的是,现代计算机都是以二进制代码的形式存储和处理数据的。

在早期的开发工作中,程序都是用机器语言编写的,为了方便读者理解指令的过程,假定要执行下列操作:1+2=?

计算机处理这个简单的运算要经过以下步骤。

1)将1载入累加器。

2)把1暂存到内存的某个地址ADDR1中。

3)将2载入累加器。

4)将内存ADDR1中的数据和累加器中的数据相加。

5)输出结果(一般是输出到内存的某个地址,如ADDR2中)。

假定在所使用的计算机中,装载操作(将数据载入累加器)用二进制代码00000001表示,加法运算用00000010表示,存储操作(对内存某个位置赋值)用00000011表示,ADDR1为1000,ADDR2为1001,如果用机器语言,需要编写如下的指令序列。00000001 00000001 (将1载入累加器)00000011 1000 (把1暂存到内存中地址为1000的单元)00000001 00000010 (将2载入累加器)00000010 1000 (将内存地址为1000的单元中的数据和累加器中的数据相加)00000011 1001 (将运算结果输出到内存中地址为1001的单元中)

可见,为了使用机器语言编写程序,程序员需要记住各种操作的二进制代码,还要记住所有数据在内存中的位置。这种编码方式难度很大,极易出错,编写程序的效率很低。注意 现在程序员已经很少使用机器语言编写程序,而是采用下面介绍的汇编语言。1.2.2 汇编语言

汇编语言(Assembly Language)的出现简化了程序员的工作,在汇编语言中,用便于记忆的方法定义程序指令。表1-1给出了汇编语言指令与机器语言指令的对应关系。表1-1 汇编语言指令和对应的机器语言指令

使用汇编语言计算“1+2=?”,则上面的机器语言指令序列可以改写成如下内容。LOAD 1SAVE ADDR1LOAD 2ADD ADDR1SAVE ADDR2

与机器语言相比,使用汇编语言编程要容易很多,但是,计算机不能直接执行由汇编语言编写的程序,必须借助“翻译”将汇编语句序列转化为计算机可以理解的二进制序列,也就是说,汇编语言指令要转换成机器语言指令的形式,才能被计算机执行。这个“翻译”的执行者就是汇编语言编译器(Assembler)。

不同的计算机可能会采用不同的二进制代码集来表示程序指令,因此,汇编语言和汇编语言编译器也和所用的计算机密切相关。1.2.3 高级语言

既然机器语言和汇编语言都是计算机可以理解的语言,用其就可以完全控制计算机的行为,那么,为什么人们还要创造并使用高级程序设计语言呢?因为机器语言和汇编语言都是低级语言,是面向机器的,与具体的计算机相关,学习起来困难,编程效率低,可读性、可维护性差。

例如,一个说普通话的北京人想要去欧洲旅行,可是,他不懂任何一门欧洲语言;恰好,一个说粤语的广东人也去欧洲旅行,而且他懂得德语、英语、法语、西班牙语等所有欧洲语言,于是,他们结伴同行。北京人想要同欧洲人交流,有两种方式:一是学习各种欧洲语言,然后直接同各个国家的人交流;二是让广东人当翻译,将自己的意思讲给欧洲人听,并将欧洲人的回答反馈给自己。如果您是那个北京人,您选择哪种方式?我想答案是确定的,肯定要请广东人当翻译。虽然普通话和粤语也有一定的差异,但是比起与欧洲语言的差异,这种差异小了很多。况且,如果直接同欧洲人交流,需要学习很多种语言。

高级语言和计算机的关系,与北京人的语言和欧洲人的关系相似。高级语言编写的程序借助于编译器就可以在特定的机器上运行,不同的欧洲人相当于不同的计算机,广东人相当于编译器,粤语相当于计算机高级语言。

高级语言的优点主要有以下两个。

·高级语言编写的程序是由一系列语句(或函数)组成的,每一条语句都对应着几条、几十条甚至上百条机器指令的序列。这样的一条语句,功能显然增强了,所以用其开发程序比用低级语言效率高得多。同时,由于高级语言的编写方式更接近人们的思维习惯,这样的程序易读,易懂,易于维护。

·用高级语言编写的程序具有一定的通用性。同样的一句话,广东人根据听众的不同将其翻译成德语、英语、法语等不同形式,达到交流和沟通的目的。高级语言的一条语句,经由不同的编译器加工编译后,生成针对特定的计算机的二进制代码。低级语言涉及计算机硬件细节,所以不具有通用性。要使高级语言编写的程序在某一台计算机上运行,只要该计算机提供该语言的翻译系统即可。思考 既然高级语言有着低级语言无法比拟的优势,是不是可以完全放弃低级语言呢?

回答是否定的。原因如下。

首先,机器语言是最终操作计算机硬件的语言,任何高级语言程序想要在计算机上执行,必须翻译成机器指令,也就是编译成二进制代码的形式。

其次,虽然高级语言在执行速度比不上同样功能的低级语言,在对硬件的操作上也不如低级语言灵活,但是在如实时控制系统这样对程序速度要求高的情况下,或者编写某种新硬件的驱动程序时,仍然会用到低级语言(主要是汇编语言)。

同汇编语言类似,高级语言也需要专门的翻译程序(称为编译器或解释器),将其编译成机器语言后才能运行。1.2.4 数据结构和算法

计算机程序规定了计算机要执行哪些动作及这些动作应当按什么顺序来执行,如同菜谱规定了厨师做菜的材料和步骤。一个程序主要有以下两个要素。

·数据结构。即数据的存储形式,程序用到的信息。

·算法。操作步骤,对操作的描述,程序用什么方法解决问题。

著名的计算机科学家Nikiklaus Wirth提出了一个公式:程序=数据结构+算法。1.2.5 面向过程的程序设计(POP)

在20世纪60年代计算机发展的初期,计算机和编程是少数聪明人的玩具,程序员可以根据自己的喜好随心所欲地进行程序设计。大多数程序代码组织混乱,只有程序员本人可以看懂,被称为“意大利面条式编程”。随着计算机的发展和程序规模的不断扩大,大量的问题凸显出来:程序质量低下、进度缓慢、预算严重超支,这就是“软件危机”。为此,人们提出了结构化程序设计方法,探讨了面向过程编程的3种基本结构,即顺序、分支和循环。大大提高了程序的清晰度和可靠性,在一定程度上缓解了“软件危机”。注意 顺序、分支和循环是现代程序设计语言的3大基本语法结构。

结构化程序设计方法建立在Bohm和Jacopini证明的结构定理的基础上。结构定理指出:任何程序逻辑都可以用顺序、选择和循环3种基本结构来表示,如图1-2所示。图1-2 3种基本结构:顺序、分支和循环

尽管结构化程序设计技术具有这样和那样的优点,但它的局限性注定了这种程序设计方法适用于规模较小的软件;当软件规模大到一定程度时,这种程序设计方法就显现出稳定性低、可修改性和可重用性差的弊端。20世纪70年代末到80年代初,面向对象的程序设计方式的出现给人们带来了新的希望。1.2.6 面向对象的程序设计(OOP)

面向对象的程序与结构化的程序不同,由C++编写的结构化的程序是由一个个的函数组成的,而由C++编写的面向对象的程序是由一个个的对象组成的,对象之间通过消息相互作用。

在结构化的程序设计中,我们要解决某一个问题,就是要确定这个问题能够分解为哪些函数,数据能够分解为哪些基本的类型,如int、double等。也就是说,思考方式是面向机器结构的,而不是面向问题结构的,需要在问题结构和机器结构之间建立联系。面向对象的程序设计方法的思考方式是面向问题的结构,它认为现实世界是由对象组成的。面向对象的程序设计方法解决某个问题,要确定这个问题是由哪些对象组成的,对象间的相互关系是什么。

纯粹的面向对象程序的设计方法如下。

·所有的东西都是对象。可以将对象想象成为一种新型变量,它保存着数据,而且还可以对自身数据进行操作。

·程序是一大堆对象的组合。通过消息传递,各对象知道自己应该做些什么。如果需要让对象做些事情,则须向该对象“发送一条消息”。具体来说,可以将消息想象成为一个调用请求,它调用的是从属于目标对象的一个方法。

·每个对象都有自己的存储空间,可容纳其他对象,或者说通过封装现有的对象,可以产生新型对象。因此,尽管对象的概念非常简单,但是经过封装以后却可以在程序中达到任意高的复杂程度。

·每个对象都属于某个类。根据语法,每个对象都是某个“类”的一个“实例”。一个类的最重要的特征就是“能将什么消息发给它”,也就是类本身有哪些操作。1.3 C++概述

C++语言是美国贝尔实验室的Bjarne Stroustrup博士和他的同事在C语言的基础上,借鉴了Simula语言面向对象的机制,于20世纪80年代初开发出来的一种过程性和对象性结合的程序设计语言。最初称为“带类的C”,1983年,Rick Mascitti将其更名为一个有双关语的符号——“C++”。1.3.1 C++语言发展历程

最初,Stroustrup使用了一个C++到C的编译器程序,将C++源代码翻译成C代码,然后通过标准的C编译器将其转化成二进制代码。随着C++的日渐普及,才出现了独立的C++编译器,直接将C++代码编译成目标代码。这种方式突出了C++“由C语言而来,却不同于C语言”的独立特点。

C++灵活而强大的功能,很快就受到了计算机软件厂商的青睐,并不断对C++进行细化,促进了C++的发展。虽然多数公司和科研单位都希望自己的C++版本能和其他版本兼容,但如果没有一个标准的出台,这将很难做到。为此,美国国家标准局在1990年设立了一个委员会(ANSI X3J16),专门负责C++标准的制定。ANSI/ISO C++国际标准第一版于1998年正式发布,2003年又发布了C++国际标准第二版。新的标准是对第一版的整理——修订错误,减少歧义等,并没有改变语言特性。最新一版的C++被称为C++0X(也被称为C++11),其中核心语言的领域被大幅改善,包括多线程支持、泛型编程、统一的初始化以及表现的加强。本书所有介绍和实例代码都是基于新的C++国际标准的。

C++程序具有很好的可移植性。换言之,C++程序的设计和编码不再拘泥于不同的操作系统,在Windows下编译无误的代码,在UNIX下同样可以顺利编译并运行。1.3.2 C++语言特点

C++语言是以C语言为基础扩充、发展起来的一种优秀的通用程序设计语言,它保存了C语言的紧凑、灵活、高效和移植性好的特点,又吸收了其他程序设计语言的优秀特性。从Simula中吸收了类的机制,从Algol中吸收了运算符重载、引用和在局部的任何地方声明变量,综合了Ada的类属和异常处理机制。

C++语言是C语言的一个超集,是一门混合型的语言,既支持传统的结构化程序设计,又支持面向对象的程序设计,这是C++语言成功流行开来的一个重要原因。

读者可能会产生疑问,既然面向对象的程序设计方法比结构化的程序设计方法先进许多,为什么C++语言仍旧支持后者,而不愿意成为一门纯粹的面向对象的程序设计语言呢?

事实上,程序员们长期采用结构化的程序设计方法,积累了许多宝贵的经验,而且结构化程序设计方法在小型软件项目的开发设计上仍然很适用,完全否定这种设计方法也是不恰当的。C++作为一门混合型语言,在增加了对面向对象方法的支持的同时,还继承了传统程序设计语言C的优点,克服了其不足之处,使得自身既适用于结构化程序设计,又能满足面向对象程序设计的要求,这就符合广大程序员逐步更新其程序设计观念和方法的要求,从而很快流行起来。说明 在学习C++前,是否需要学习C语言呢?答案是不需要,把C++当成一门新的语言来学习。本书完全适用于没有C语言基础的读者,甚至是没有学习过编程、没有写过一行代码的读者。本书致力于培养读者用C++的思维方式去解决问题的能力。1.3.3 C++程序开发基本过程

下面开始我们的编程之旅。开发一个C++程序,首先要建立问题的模型,根据具体问题的特点,选择过程模型或者对象模型,并将模型实现为源程序。

同其他高级语言一样,要想得到可以执行的C++程序,必须对C++源程序进行编译和链接。C++程序编译链接的过程如图1-3所示,大体有以下几个步骤。图1-3 C++程序编译链接的过程

·编辑(Edit):使用文本编辑工具编写C++程序,其文件扩展名为.cpp。这种形式的程序称为源代码(Source Code)。

·编译(Compile):用编译器将源代码转换成主机使用的内部语言——二进制形式的机器语言,文件扩展名为.obj。这种形式的程序称为目标代码(Objective Code)。

·链接(Link):将若干目标代码和现有的二进制代码库经过链接器链接,产生可执行代码(Executable Code),文件扩展名为.exe。说明 在不同的计算机平台(如Windows,UNIX,Linux等)上,C++源文件和目标文件代码的后缀名可能会有所不同,不过都要遵循编辑、编译和链接3个步骤以生成可执行文件,本书以Windows操作系统为示例平台。1.4 C++开发环境的搭建

C++的流行使得许多软件厂商都提供了自己的C++集成开发环境,称为C++IDE。著名的有Borland公司的C++Builder(BCB),Microsoft公司的Visual C++(VC)等。所谓集成开发环境,即在同一个环境下,能够完成C++源程序的编写、连编、运行和调试。说明 对初学者而言,不要被VC、BCB、BC(Borland C++)、MC(Microsoft C++)和TC(Turbo C++)等词汇所迷惑,它们都是集成开发环境,而我们要学的是一门语言。

本书以Windows操作系统下流行的C++集成开发环境Visual C++6(VC6)+sp6为示例开发环境,所有示例代码都在(Windows XP+VC6/Windows 2000+VC6)下编译通过。1.4.1 Visual C++6开发环境简介

Visual C++6集成开发环境,被划分成4个主要区域:菜单和工具栏、工作区窗口、代码编辑窗口和输出窗口,如图1-4所示。图1-4 Visual C++6集成开发环境主界面1.4.2 开发步骤

一般情况下,开发一个应用程序按照如下步骤来进行。

1)建立一个工程。使用Visual C++6集成开发环境进行C++程序开发,必须为程序创建一个工程(Project),并将组成程序的一个或多个文件加入到工程中。工程文件扩展名为.dsp(保存工程设置),维护应用程序中所有的源代码文件以及Visual C++编译、链接应用程序,以便创建可执行程序。在Visual C++6的集成开发环境中,可通过“File”菜单中的“New”命令创建一个新的工程。创建一个工程的同时,也创建了一个工作区(Workspace)。工作区文件的扩展名为.dsw(保存项目工作区的设置)。如图1-5所示,一个工作区可包含多个工程,每个工程对应一个可执行程序。图1-5 工作区与工程关系示意图

执行“File”菜单中的“New”命令后,出现如图1-6所示的对话框。单击“Projects”选项卡,左侧列出了供选择的工程类型,就本书中的示例程序而言,应当选择“Win32 Console Application”。说明 本书讲解的是C++语言,示例代码都是通用的,与具体的系统环境关系不大,如无特别说明,本书示例代码中所有工程都是“Win32 Console Application”类型的。

在右侧“Project name”文本框中输入要建立的工程名,在“Location”文本框中可手动输入或通过“…”按钮选择工程文件的存放位置。选择右侧中部的“Create new workspace”单选按钮建立一个新的工作区。因为编译完成的可执行文件运行在Windows平台上,“Platforms”中的“Win32”复选框是默认选中的,无需更改。

单击“OK”按钮进入下一步,如图1-7所示。图1-6 使用“File”|“New”命令创建工程图1-7 建立空工程

选择“An empty project”选项,然后单击“Finish”按钮,完成工程创建。

2)向工程中添加源代码文件。源代码文件一般由以下类型文件组成。

·头文件,也称为include文件。

·源文件,扩展名为.cpp。

向工程中添加源文件的方法如下。

·创建新的源代码文件,并将其添加到工程中去。选择“File”菜单中的“New”命令,单击“Files”选项卡,单击“C++Source File”(如图1-8所示)。选中“Add to project”复选框,在“File”文本框中输入文件名(如main.cpp)。可以在“Location”文本框中为要创建的文件指定目录或直接采用当前目录,然后单击“OK”按钮即完成源文件的创建。按照同样的方式,选择“C/C++Header File”创建新的头文件。

·添加一个已存在的源代码文件和资源文件到工程中。选择“Project”菜单中的“Add to project”命令,再选“Files”命令,在弹出的“Insert Files Into Project”对话框中选择要添加的文件,单击“OK”按钮即可。图1-8 新建源代码文件技巧 在添加已存在的源代码文件和资源文件到工程中时,按住键或键,可同时选择多个要添加的文件。

从工程中删除一个文件。打开“FileView”文件视图,选择要删除的文件,按键即可。这仅是将文件从项目中移去,并非真正地把文件从硬盘中删除。

3)编辑源代码。在代码编辑窗口中对建立的源代码文件进行编辑,在“FileView”文件视图中双击文件名即可打开右侧的源代码编辑器,对其进行编辑。

4)项目配置。在开发应用程序时,一般将项目设置为Debug模式。在该模式中,编译器将Visual C++Debug所需的调试信息一同编译。当程序调试完毕准备发行时,将项目设置为Release模式。选择“Build”菜单中的“Set Active Configurations”命令,在弹出的“Set Active Project Configuration”对话框中进行选择即可实现Debug模式和Release模式间的相互切换。

5)编译链接。选择“Build”菜单中的“Build工程名”命令,或直接按键即可实现对整个工程所有源代码文件的编译和链接。编译链接无误即可生成一个扩展名为.exe的可执行文件。如果程序违反了语言规则,编译器将生成错误信息。指出错误所在的行,并在输出窗口中显示出来。我们可以通过单击输出窗口中的错误信息在代码编辑窗口中迅速定位出错位置。提示 理解错误提示的意义很重要。有时,真正的问题或错误可能在标识出的错行之前,而且一个错误可能引发一连串的错误消息。因此,改正错误时,应首先改正第一个错误消息。

6)运行应用程序。从“Build”菜单中选择“Execute工程名.exe”,或者按键,或用鼠标左键单击按钮便可运行该应用程序。

以上是用Visual C++6创建一个工程的简单过程。实际上,Visual C++6功能很强大,能做的事情还有很多。随着我们C++编程水平的提高,会对其有更深刻的认识和理解,也能更好地用好这个工具。1.5 第一个C++程序

在屏幕上显示“Hello,World”,几乎是所有编程教科书讲述的第一个程序,那就让这个最简单的程序带我们走进C++的圣殿吧!

按照1.4节的介绍建立工程,添加源代码文件HelloWorld.cpp,如代码1-1所示。

代码1-1 第一个C++程序:HelloWorld<--------------------------------文件名:example101.cpp---------------------------->01 #include //编译预处理:头文件02 int main() //主函数03 {04 using namespace std; //using编译机制,引入名称空间05 cout<<"Hello,World\n"; //输出“Hello,World”,'\n'代表换行06 return 0; //返回07 }【代码解析】代码第5行是关键,调用输出对象cout,在屏幕上显示“Hello,World”字符串。注意 如果读者没有使用Visual C++6,或所用的编译器较老,可能需要使用“#include”代替“#include”,同时去掉代码行“using namespace std;”。

编译链接并运行该程序,结果如图1-9所示。图1-9 第一个C++程序:输出“Hello,World”

怎么样?看着自己编译出来的第一个C++程序,是不是很有成就感呢?关于上面程序的意义,以及C++程序的结构和语法,在以后的章节中将会有详细的介绍。本书的写作初衷,就是带领读者一步一步徜徉在博大精深的C++世界中。1.6 C语言与C++语言的区别

C++语言是由C语言发展而来的,C语言是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出或实现过程(事务)控制。而对于C++程序,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。1.6.1 程序设计思想的区别

C语言与C++语言的最大区别在于解决问题的思想方法不一样,即它们在程序设计思想上的区别。之所以说C++语言比C语言更先进,是因为“设计这个概念已经被融入到C++语言之中”。而就语言本身而言,在C语言中更多的是算法的概念,但是C语言是C++语言的子集。从上文可以看出,C语言实现了C++语言中过程化控制及其他相关功能,而在C++语言中的C语言,相对于原来的C语言也有所加强,引入了重载、内联函数、异常处理等概念,C++语言更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等。

再深入一点,在C++语言中,除了考虑数据封装、类型问题以外,还需要考虑诸如对象粒度的选择、对象接口的设计和继承、组合与继承的使用等问题。所以相对于C语言,C++语言包含了更丰富的“设计”的概念。但C语言是C++语言的一个子集,也具有强大的功能,同样值得学习。1.6.2 语法规范的区别

对于C语言和C++语言,它们在语法上的区别主要有以下几点。

1)在C++语言中,for语句中可以出现“for(int i=0;i<5;i++)”,即定义i的同时使用它;但在C语言中不能这样,只能先定义,然后再使用,如“int i;for(i=0;i<5;i++)”。

2)在C++语言中定义struct、union和enum类型的变量时,关键字struct、union和enum可以省略;在C语言中不能忽略。

3)在C++语言中,可以用const类型的整数作为数组的大小;在C语言中不可以。

4)在C语言中,const类型的变量是对外可见的,所以只能出现在源文件中;而在C++语言中,const类型的变量只有内部可见,所以可以出现在头文件中。例如,在C语言源文件中通过语句“const int i=2;”定义i,因为它是对外可见的,所以在其他的模块中可以通过声明“extern const int i;”来引用它;而在C++语言中,因为const类型的变量默认只有内部可见,如果想定义对外部可见的变量,必须用extern修饰,例如用“extern const int i=2;”定义变量i,如果是在C++文件中定义一个在C语言中使用的变量,可以用“extern”C“const int x=10;”语句。

5)因为C++语言中有new关键字,所以可以使用new动态分配数组,这样在定义数组的时候可以根据运行中的数据指定数组大小,用完后使用“delete[]”删除;而在C语言中,定义数组的时候必须明确指定其大小。1.7 小结

本章主要讲述计算机和程序设计的基本概念、方法,并简单介绍了C++语言的特点以及Visual C++集成开发环境的使用方法。C++语言是当今最流行的高级程序设计语言之一,它既支持结构化的程序设计方法,又支持面向对象的程序设计方法。使用Microsoft Visual C++提供的集成开发环境,程序员可以轻松完成C++工程的创建、编译、调试和运行。1.8 习题

一、填空题

1.中央处理器由以下几部分组成:____、____、____、____和____。

2.软件大体上可以分为两类:____和____。

3.著名的计算机科学家Nikiklaus Wirth提出了一个公式:____。

4.现代程序设计语言的3大基本语法结构是____、____和____。

二、上机实践

修改代码1-1的输出内容,并查看输出结果。【提示】本题主要是要求读者认识一下C++语言,重点是掌握输出字符技术。【关键代码】 cout<<"My Name is Computer!"<

古语说,“欲速则不达”。不论是盖房还是学知识,打牢基础十分重要。没有坚实的地基,摩天大楼就无法耸立。学习C++同样需要深入掌握基础知识和基本结构,下面就从C++大厦的基本框架说起。

本章主要涉及以下知识点。

·C++程序的结构:介绍C++程序中注释、主函数及名称空间。

·变量与基本类型:介绍C++程序中的各种变量及基本数据类型。

·常量:介绍C++中如何定义常量及其类型。

·运算符与表达式:介绍定义与使用C++中的基本运算符与表达式。

·类型转换:讲解将C++中的基本数据类型转换及其注意事项。

·流程控制语句:讲解C++中用于控制程序流程的基本语句。2.1 C++程序的结构

下面是两个数相乘的程序,计算机要求用户先输入两个整数,而后计算两数的乘积并输出在屏幕上,程序如代码2-1所示。

代码2-1 两数相乘MultiplyTwoNumber<-------------------------------文件名:example201.cpp----------------------------->01 #include //编译预处理02 int main() //主函数03 {04 using namespace std; //名称空间编译指令05 /*06 声明3个代表整数的符号,num1和num2为乘数和被乘数,07 resultNum为乘积,它们的初值都为008 */09 int num1=0, num2=0, resultNum=0; 10 cout<<"请输入要相乘的两个整数,用空格键分开:"; //输出提示语句11 cin>>num1>>num2; //接收用户输入12 resultNum=num1*num2; //乘法运算13 cout<<"计算结果为"<

编译运行,输出结果如下所示。请输入要相乘的两个整数,用空格键分开:5 6(键盘输入)计算结果为30

每个C++程序都由注释、编译预处理和程序主体3部分组成,下面分别进行讨论。2.1.1 C++的注释风格

C++支持两种风格的注释。

·C++风格:以//打头,作用范围为一行。

·C风格:以“/*”开始,以“*/”结束,两个符号间的内容都会被注释掉,因此可以跨越多行。使用时,应注意“/*”和“*/”的正确配对,C风格注释不支持嵌套。

注释是程序员为读者提供的说明,是提高程序可读性的一种手段。注释仅供他人阅读程序时使用,是程序的可选部分。C++编译器忽略所有的注释,将其视为空白。提示 读者应养成在编码时随手写注释的好习惯,程序越复杂,就越有必要写注释。注释不仅方便他人阅读代码,而且有助于程序员的总结、检查与回顾。2.1.2 编译预处理与新旧标准

以符号#开头的行,称为编译预处理行。代码2-1中使用了#include编译指令,其作用是在编译之前将iostream文件的内容添加到程序中。iostream设置了C++的输入输出环境,如cin和cout是在iostream中定义的C++标准输入、输出设备标识符,endl是iostream中定义的换行符。关于编译预处理的详细介绍请参考第18章。注意 使用cin和cout进行输入和输出时,程序中必须包含iostream文件(对于旧式编译器,程序中应包含iostream.h文件)。

前面已经讲过,C++语言是C语言的一个超集,早期的C语言和C++语言的头文件都采用扩展名为.h的形式,随着C++语言的发展,头文件的标准也在不断地变化。图2-1给出了新旧标准的对比,C++一栏中灰色区域代表纯粹的C++头文件,白色区域代表C头文件。新标准保留了老式的C文件头文件.h扩展名(C++程序仍可使用这种文件);而C++的头文件去掉了扩展名。有些C头文件(如图2-1中的X2.h)被转换成C++头文件,去掉了扩展名,并在文件名称前加上了前缀C(表明来自C语言),对应于图2-1中的网格状区域(CX2)。较旧的编译器可能只支持旧标准格式,符合ANSI/ISO C++最新标准的编译器既支持旧标准格式,也支持新的头文件格式。对纯粹的C++头文件来说(如iostream),去掉扩展名.h并不仅仅是形式的变化,没有.h的头文件还使用了名称空间机制。图2-1 头文件新旧标准变化对比图2.1.3 主函数

C++用函数组织过程,每个相对独立的过程都可组织成一个函数,程序一般由不同的函数按层次结构组织而成。因此,函数的定义是C++的主体,这里先对函数有个大体的了解,详细的介绍和说明请参考第6章。

函数由函数头和函数体两部分组成,其基本结构如下代码所示。返回值类型 函数名(参数列表){语句1;语句2;…语句N; return 返回值;}

通常,C++函数被其他函数调用(激活),第一行“返回值类型函数名(参数列表)”称为函数头,定义了函数和调用函数之间的接口,“返回值类型”定义了从函数返回给调用函数的信息,参数列表描述的是从调用函数传递给被调用函数的信息。花括号之间的部分称为函数体,说明了函数应当执行的计算机指令。在C++中,一条完整的指令称为一条语句(Statement),每条语句都以分号结尾。注意 忘掉语句结尾的分号是初学者常犯的错误,时刻提醒自己,不要省略分号。

花括号中的最后一条语句称为返回语句(Return Statement),在C++中用其标志一个函数的结束。

本例中只有一个main()函数,称为主函数。该函数会被自动启动代码调用,而启动代码是在编译阶段由编译器添加到可执行文件中的,是程序与操作系统之间的桥梁。因此,main()函数是C++程序的入口,每个C++程序有且仅有一个main()函数,main函数在文件中的位置并没有特别的要求,可以在文件的头部、中部或尾部,基本形式如下所示。int main(){… //语句序列 return 0;}

main()函数的函数头表明:main()函数可以给操作系统返回一个int类型的值,且没有输入参数。实际上,main()函数可以接受操作系统传来的命令行参数。关于带参主函数与命令行参数的问题,在第7章中会有详细的介绍。说明 有些参考书中使用void main()这样的函数头,并省略了返回语句,这在逻辑上是没有问题的,void意味着函数不返回任何值,但这样的写法不符合ANSI/ISO C++标准格式,在某些系统中可能无法正常运行。因此,建议使用符合标准的int main()函数头格式。有时读者也会碰到main()这样的函数头,采用这种定义方式时,当编译器到达main()函数的末尾没有遇到返回语句时,则认为main()函数以“return 0;”结尾,这种写法也符合ANSI/ISO C++标准。2.1.4 名称空间

在代码2-1中,使用iostream头文件,应使用名称空间编译指令“using namespace std;”使得cout和cin对程序可见,这称为using编译指令。这里,先对名称空间做简要的说明,详细的介绍请参考第15章。

在使用计算机软件厂商提供的源代码时,经常会遇到函数重名或变量重名的情况,编译器不知道该使用哪个版本,人为对函数和变量进行改名也不现实。为了解决这一问题,新的ANSI/ISO C++标准引入了名称空间这一特性。允许厂商将其产品封装在一个叫名称空间的单元中,使用名称空间来对函数和变量进行管理,编译器也可以决定使用哪个版本。如A公司和B公司提供的源代码中都有C()函数,并将各自的代码都定义在名称空间NamespaceA和NamespaceB中,使用下面的调用方式可以将两个版本准确无误地区分开。NamespaceA::C(); //调用A公司提供的C函数NamespaceB::C(); //调用B公司提供的C函数

C++标准库中提供的函数和变量都放置在名称空间std中,在iostream中定义的cin、cout和endl实际上是std::cin、std::cout和std::endl。在代码2-1中,使用了using编译指令(“using namespace std;”),使得std名称空间中的所有名称都可用,也就可以省略掉前缀“std::”。换言之,代码2-2与代码2-1是等价的。

代码2-2 两数相乘的另一种写法AnotherMultiply2Number<----------------------------文件名:example202.cpp----------------------------->01 #include //编译预处理02 int main() //主函数03 {04 int num1=0, num2=0, resultNum=0; 05 std::cout<<"请输入要相乘的两个整数,用空格键分开:"; //输出提示语句06 std::cin>>num1>>num2; //接收用户输入07 resultNum=num1 * num2; //乘法运算08 std::cout<<"计算结果为"<

使用“using namespace std;”是个偷懒的办法,这使得std名称空间中所有的名称都可用,更好的办法是使用using声明语句,只让需要的名称可用。

将“using namespace std;”用下列语句替换。using std::cin;using std::cout;using std::endl;

这样就可以使用cin、cout和endl,而不用加“std::”前缀,不过要使用iostream中的其他名称,同样必须先进行声明。

using声明语句既可以像代码2-1一样放在main()函数内部(std名称空间中所有的名称只能在main()函数内使用),也可以放在main()函数外部,使其获得全局的可见性,这样可以在文件中任何地方使用std名称空间中所有的名称。说明 名称空间是C++语言一种新的特性,只针对新标准的C++语言头文件(即没有.h后缀,如#include)才有效,对旧标准的头文件(如“#include”),using语句没有意义。2.1.5 C++语素

从编译角度看,组成C++的最小逻辑单位是单词,单词好比建屋盖房的砖瓦,C++中的单词有以下几类。

1)直接常量。如代码2-1中的0。

2)字符串。一对双引号之间的字符序列,是常量的一种,如代码2-1中的“请输入要相乘的两个整数,用空格键分开:”和“计算结果为”。

3)关键字。系统定义的一些对编译程序有特别意义的名字,表2-1列出了ANSI/ISO标准C++的关键字。表2-1 ANSI/ISO C++关键字

关键字是一种特殊的标识符,关键字具有特定的含义,不能再对其定义。

4)一般标识符。由程序员定义的名字,主要包括类名、变量名(如代码2-1中的num1,num2和numResult)和函数名等。

自定义的标识符有一定的命名规则,一般来说有以下几点。

·由大小写字母(a~z或A~Z)、下划线和数字组成(中间不允许有空格和标点符号),必须以一个字母或下划线(_)开头,即数字不能打头。

·大小写字母表示不同的意义,如num1和Num1是两个不同的标识符。

·不能使用关键字作为标识符,所以标识符也称为保留字。

·在定义标识符时,虽然语法上允许用下划线开头,但是我们最好避免定义用下划线开头的标识符,因为编译器常常定义一些用下划线开头的标识符。

·C++没有限制一个标识符中的字符个数,但是不同的编译器可识别的长度有一定的限制。不过,我们在定义标识符时,通常并不用担心标识符中字符数是否会超过编译器的限制,因为编译器限制的数字通常很大。注意 一个写得好的程序,标识符应该尽量直观,可“望文知意”。

5)运算符。代码2-1中的“<<”和“>>”分别称为“输出运算符”和“输入运算符”。除此之外,C++中主要的运算符还有如下几种。

·算术运算符:加减乘除(+、-、*、/)、取模(%)、自增(++)和自减(--)。

·关系运算符:小于(<)、小于等于(<=)、大于(>)、大于等于(>=)、等于(==)和不等于(!=)。

·逻辑运算符:与(&&)、或(||)和非(!)。

·赋值运算符:赋值(=)。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载