📄 c++a.txt
字号:
由于c语言是标准化、硬件无关、广为使用的语言,因此用C语言编写的应用程序通常只要稍作修改或不经修改即可在多种不同的计算机系统中运行。
C++是C语言的扩展,是20世纪80年代初由贝尔实验室的Bjarne stroustrup开发的。C++的许多特性是从c语言中派生的,但更重要的是,它提供了面向对象编程(object-oriented programming)的功能。
软件业正在酝酿一场革命,最终日标是更快、更正确、更经济地建立软件,新的、更强大的软件需求迫在眉睫。对象(object)实际上是模拟实际项目的可复用软件组件(component)。软件开发人员发现,利用模块化、面t向对象的设计和实现方法与过去结构化编程方法相比较,可以使软件开发小组的生产率更高。面向对象编程的优势在于更容易理解、纠正和修改。
许多面向对象的语言也纷纷涌现,包括最著名的由Xerox的Palo Alto研究中心(PARC)开发的small talk。Smalltalk是纯粹的面向对象的语言,其所有的编程元素都是“对象”。C++则是一种“混合型语言“,可以用C语言方式、面向对象方式或兼用两种方式进行编程。1.9节将介绍基于C/C++的新语言——Java。
1.8 C++标准库
C++程序由类(class)和函数(function)组成。可以用多个小的软件模块构成C++程序,但大多数C++程序员会利用C++标准库中已有的类和函数来编程。这样,C++“世界”中实际要学习两方面的知识,第一是学习C++语言本身,第二是学习如何利用C++标准库中现有的类和函数(本书将介绍许多类和函数)。 Plauger(见参考文献P192)的著作是程序员必读的.可以帮助程序员深入了解C++中包括的ANSI C语言库函数,了解如何实现这些库函数,还可以了解如何用库函数编写可移植代码。标准库函数通常由编译器厂家提供。许多独立软件供应商(indepandent softerware vender)也提供各种专用类库。
软件工程视点1.1
使用构件块方法(building block approach)生成程序,而不要事事从0开始。尽量利用现有程序块,这称为软件复用(software reuse),是面向对象编程的核心。
软件工程视点1.2
C++编程中通常使用下列构件块:C++标准库中的类和函数.自己生成的类和函数和各种常见非C++标准库中的类和函数。
自己生成类和函数的优点在于知道其如何工作,可以检查C++代码:缺点是要花大量时间及精力来设计、开发和维护这些类或函数,使其正确、有效地运行。
性能提示1.1
利用标准库函数和类而不用自己的对应版本可以提高软件性能,因为这些软件经过认真编写,能保证有效操作。
可移植性提示1.2
利用标准库函数和类而不用自己的对应版本可以提高软件性能,因为几乎所有C++版本都包括这些软件。
1.9 Java、Internet与万维网
这是C++程序员应当高兴的时刻,整个计算机行业都为新的ANSI/ISO草案标准最终得到批准而感到兴奋。
]995年5月,Sun公司宣布推出新的Java编程语言。sun公司是基于UNIX的高性能工作站的领导厂家,一直强调计算机网络的重要性。Java是基于C/C++的语言,加入了许多面向对象编程的特性。sun公司提供了基本Java软件、文档、教程和演示,可以在Web站点www.javasoft.com免费取得。Java具有大量的类库,包括支持多媒体、网络、图形、数据库访问、分布式计算等软件组件。
Java最吸引入的属性之一是它的可移植性,可以在一台计算机上编写Java程序.然后在任何支持Java的计算机上运行(目前大多数常见计算机系统都支持Java)。这对软件开发人员特别具有吸引力,他们可以不再为不同类型的计算机系统开发或维护不同的软件版本。为不同类型的计算机系统开发和维护不同的软件版本是非常费时、费力的,使得独立软件供应商只能生产常见系统平台中使用的软件,如Microsoft Windows。如今,基于Java的软件应用程序可以在所有常用的Microsoft widowe版本中和各种UNIX、Macintosh及OS/2等大多数流行的系统平台中运行。
我们体会到Java在学校和企业客户中的重要性,因此编写了几本Java教材和基于交互式光盘的学习软件包。这个语言变化得很快,因此我们在第一版《JavHow to Program》推出后仅11个月又推出了其第二版。C++要成熟很多(是1980年创建的),因此《C++大学教程》在第一版推出三年半之后才推出第二版,以配合ANSI/ISO C++草案标准的推广。
1.10 其他高级语言
高级语言有数百种,但被广泛采用的只有少数几种。(COmmon Business Oriented Language)是1954到]957年之间由IBM公司开发的,在需要复杂数学计算的科学和工程项目中应用较多。FORTRAN仍然在工程领域广为使用。
COBOL(COmmon Business Oriented Language)是1959年由计算机制造商、政府和工业企业计算机用户开发的。COBOL擅长于需要精确和有效地操作大量数据的商业应用。因此,有大量的企业软件是用COBOL编写的。
Pascal(由Niklaus Wirth 教授设计)是与c语言同期出现的在涫术界应用较多,下一节将详细介绍Pascal语言。
1.11 结构化编程
20世纪60年代,许多大型软件的开发遇到了严重困难。常常推迟软件计划,因而使成本大大超过预算,而且最终产品也不可靠。人们开始认识到,软件开发是项复杂的活动,比原来所预想的要复杂得多。20世纪60年代的研究结果是结构化编程(structured programming)的出现,用规定的方法编写程序比非结构化编程能产生更清晰、更容易测试/调试以及更容易修改的程序。本书的第2章将介绍结构化编程原理。第3章到第5章则会开发多种结构化程序。
结构化编程研究的一个更具体结果是1971年Niklaus Wirth教授推出了Pascal语言。Pascal语言是用17世纪著名数学家和哲学家巴雷斯·帕斯卡(Blaise Pascal)的名字命名的,常用于教学中讲解结构化编程.因而很快成为了大学中受欢迎的语言。但是这个语言缺乏在商业、工业和政府应用程序中所需要的许多特性,因此没有被大学以外的环境所接受。
Ada语言是在20世纪70年代和80年代初由美国国防部资助开发的。在此之前,国防部的导弹命令与控制软件系统是由几百种不同语言生成的,国防部要求用一种语言来完成大多数工作。Ada以Pascal为基础.但最终结构与Pascal大相径庭。这个语言是根据著名诗人Lord Byron的女儿(Ada Lovelace)的名字命名的。Ada Lovelace在19世纪初编写了世界上第一个计算机程序,用于charles Babbage设计的分析机引擎的计算设备。Ada的一个最重要功能是多任务(multiasking).程序员可以使多个活动任务并行发生。我们要介绍的其他常用高级语言(包括C/C++)通常只让程序员编写一次只有一个活动任务的程序。
1.12 典型C++环境基础
C++系统通常由几个部分组成:程序开发环境、语言和C++标准库。下面介绍图1.1所示的典型C++环境。
C++程序通常要经过6个阶段(如图1.1),即编辑(edit)、预处理(Preprocess)、编译(compile)、连接(Link)、装入(load)和执行(excute)。这里主要介绍典型UNIX C++系统(注意,本书的程序不经修改或稍作修改即可在大多数当前的++系统中运行,包括Microsoft Windows系统)。如果当前使用的不是UNIX系统,可以参看系统手册或向老师请教如何在相应环境中完成这些工作。
第一个阶段是编辑文件,这是用编辑器程序(editor program)完成的。程序员用编辑器输入C++程序,并进行必要的修改.然后将程序存放在磁盘之类的辅助存储设备中。C++程序文件名通常以.cpp、cxx或.C的扩展名结尾(注意C为大写),详见C++环境文档中对文件名扩展的说明。UNIX系统中两个广泛使用的编辑器是vi和emacs。个人计算机上的Borland C++和Microsoft visualC++等C++软件包都有自己的编辑器,它们与编程环境紧密集成。这里,我们假设读者已经知道如何编辑程序。
随后的阶段是程序员发出编译(compile)程序的命令。编译器将C++程序翻译为机器语言代码(也称为目标码)。在C++系统中,预处理程序在编辑器翻译阶段开始之前自动执行。C++预处理器采用预处理指令(Preprocess directive)表示程序编译之前要进行的某些操作。这些操作通常包括在要编译的文件中包括其他文本文件和进行各种文本替换。前面几章将介绍最常见的预处理指令,所有预处理指令的详细介绍见第17章“预处理器”。编辑器在将程序翻译为机器语言代码之前调用预处理器。
下一个阶段是连接。C++程序常常引用其他地方定义的函数,如标准库中或持定项目的程序员使用的专用库。C++编译器产生的目标码通常包含由于缺少一些内容而造成的“空穴”,连接器(1inker)将目标码与这些默认功能的代码连接起来,建立执行程序映像(不再缺少任何代码)。在典型的UNIX系统中,编译和连接C++程序的命令是CC。要编译和连接程序welcom.C,在UNIX提示符下键人:
CC welcome.C
并按Enter键(或Return键)。如果程序编译和连接正确,则产生文件a.out。这就是welcome.C的执行程序映像。
再下一个阶段是装入。执行之前,要先把程序放进内存中,这是由装入器(Loader)完成的,装入器读取磁盘中执行程序的映象文件,并将其放进内存中。
最后,计算机在CPU控制下逐条指令地执行程序。要在UNIX系统中装入并执行程序.可在UNIX提示符下键入a.out并按Return键。
程序不是一次就能够运行。上述每个阶段都可能因为各种错误而失败。例如,可能除数为0(计算机上的非法操作,和算术运算中一样),这会使计算机打印出错信息。然后.程序员需返回编辑阶段,进行必要的修改并继续其余阶段,确定修改之后能否顺利工作。
常见编程错误1.1
如果除数为0之类的错误在程序运行时发生,则称这类错误为运行时错误(run-time error)或执行时错误(execution-time error)。除数为0通常是个致命错误,会使程序立即终止,无法完成工作。非致命错误能让程序运行完毕,但会产生错误结果(注意,在有些系统中.除数为0不是致命借误,详见系统的说明文档)。
C++中的大多数程序都要输入/输出数据。有些C++函数的输入来自cin(标准输人流),通常是键盘,但也可以连接其他输入设备。数据通常输出到co皿(标准输出流).一般是计算机屏幕,但也可以是其他设备。程序打印结果,通常是指在屏幕上显示结果。数据也可以输出到其他设备,如磁盘和硬拷贝打印机。还有称为cerr的标准错误流(standard error stream),通常连接屏幕,用于显示错误消息。用户经常把普通输出数据(即cout)路由到非屏幕设备,而让cerr输出到屏幕,可以立即通知用户发生错误。
1.13 C++与本书的一般说明
C++是个复杂的语言。熟练的C++程序员有时以能够编写一些稀奇古怪的小程序为荣,这可不是好的编程习惯,因为这样会使程序更难阅读、更难测试和调试,也很难根据需求改变而改变。本书面向初学的程序员,因此我们强调情晰性。下面是第一个编程技巧。
编程技巧1.1
C++程序应以简单和直接的方式编写,称为KIS(“keep it simple ,保持简单),不要使用不常用的方法任意地扩大程序。
本书提供了许多编程技巧,帮助读者养成良好习惯,编写更清晰、更易懂、更易维护、更易测试和调试的代码。这些技巧只是个指导原则,读者完全可以选择自己喜欢的编程风格。我们还介绍常见编程错误(在程序中要注意各种问题以避免这些错误)、性能提示(使程序的运行速度更快和使用更少内存的方法)、可移植性提示(帮助编写不经修改或稍作修改即可在其他计算机上运行的程序)、软件工程视点(影响和提高软件系统总体结构的概念和思想,特别是大型软件系统)和测试与调试提示(测试程序以找出和消除缺陷的提示)。
前面曾介绍过,C和C++是可移植语言,C和C++编写的程序可以在许多不同计算机上运行。可移植性是个重要目标。ANSI C语言标准文档(见参考文献An 90)中列出了大量移植性问题,还有介绍移植性问题的专著(见参考文献Ja89和Ra90)。
可移植提示1.3
尽管可以编写可移植程序,但不同的C和C++编泽器和不同计算机的许多问题使移植性难以实现。C或C++写成的程序并不一定是可移植程序。程序员通常需要立接涉及不同的编泽嚣和不同的计算机。
前面介绍了ANSI/ISO C++草案标准文档的演变过程和检查了其完整性与准确性。但C++是个丰富的语言,其中有些细节和高级课题是我们所没有介绍的。如果需要C++的详细技术信息,可以阅读这个文档的最新草案。从下列web站点可以取得草案:
http://www.cygnus.com/m13c/wP/
我们列出了关于C++和面向对象编程的大量文献与图书目录,还列出了C++资源目录,包含许多与C++和面向对象编程的有关Web站点。
当前C++版本的特性与旧版本的不兼容,因此本文中的某些程序也许无法在旧版的C++编译器中工作。
编程技巧1.2
阅读所使用的C++版本的手册,经常翻阅这些手册,能够知道C++的丰富特性并正确使用这些特性。
编程技巧1.3
使用计算机和编泽器有助于学习C++。如果阅读所用C++版本的手册之后还不知道C++工作的特性,可以试用一个小的则试程序(test program),看看其如何工作。设置编泽器这项为最大警告(maximum warning)。注意编译程序时出现的每个消息,并纠正问题,消除这些消息。
1.14 C++编程简介
C++语言提供了计算机程序设计的结构化和规则化方法。我们现在要介绍C++编程,并用几个例子演示C++的许多重要特性.每个例子一次分析一条语句。第2章介绍C++中结构化编程的详细处理,然后到第5章一直使用结构化编程方法。第6章开始介绍C++面向对象编程,由于面向对象编程在本书的核心重要性,因此前五章各有一节“有关对象的思考”。这些小节介绍面向对象编程的概念和实例,让读者设计和实现面向对象的C++程序。
1.15 简单程序
C++使用非程序员可能感到奇怪的符号。我们首先介绍一个简单程序:打印一行文本。程序及其屏输出如图1.2。
这段程序演示了C++语言的几个重要特性。我们详细介绍程序的每一行。
// Fig.1.2:fig1_02.cpp
// A first program in C++
以//开头,表示该选项其余部分是注释语句(comment)。程序员手稿注释语句用来说明和提高程序的可读性。注释语句还可以帮助其它人阅读和理解程序。在运行程序时注释语句并不使计算机采用任何操作。C++编译器忽略注释误句,不产生任何机器目标码。注释语句"first program in C++"只是描述该程序的用途。以//开头的说明语句称为单行貹注释语句(singned-line comment),因为该注释语句在行尾结束(注意:C++程序员也可以用C语言注释语句样式,即注释语句以/*开头,以*/结束)。
1 // Fig. 1.2:fig01_02.cpp
2 // A first program in C++
3 #include<iostream.h>
4
5 int main()
6 {
7 cout<<"Welcom to C++!\n";
8
9 rerturn 0; // indicate that program ended sucessfully
10 }
输出结果:
Welcom to C++!
编程技巧1.4
每段程序以注释语句开头,描述该语句的用途。
下列语句:
#include<iostream.h>
是条预处理指令(preprocessor directive),是发给C++预处理器的消息。预处理器先处理以#开头的一行语句之后再编译该程序。为一行预处理指令告诉预处理器要在程序中包括输入、输出泫头文件iostream.h的内容。应该在任何使用C++式输入、输出泫从键盘输入数据或向屏幕输出数据的程序中包括这个头文件。图1.2中的程序向屏幕输出数据,iostream.h的内容将在稍后详细介绍。注意,最新ANSI、ISO C++杂标准实际上指定iostream.h和其它标准头文件不需要后缀.h,如iostream。我们在本书余下部分继续使用旧式头文件,因为许多编译器还不支持最新的ANSI/ISO C++草案标准。1.20节将再次介绍这个例子,演示如何使用新式头文件。
常见编程错误1.2
如果从键盘输入数据或向屏幕输出数据的程序中没有包括iostream.h头文件,则编译器会发出一个错误信息。
下列语句:
int main()
是每个C++程序都包的语句。main后面的括号表示main是个程序基本组件, 称为函数(function)。C++程序包含一个或几个函数,其中有且只有一个main函数即使main不是程序中的第一个函数,C++程序通常都从main函数开始执行。main左边的关键字int表示main返回一个整数值。我们将在第3章深入介绍函数时再介绍返回值的含义。目前只要在每个程序的main函数的左边包括关键字int即可。
左花括号({)应放在每个函数体(body)开头,对应右花括号(})应放在每个函数的结尾。下列语句:
cout<<"Welcom to C++!\n";
让计算机在屏幕上打印引号之间的字符串(string)。 整个行称为语句(statement),包括cout<<运算符、字衔串"Welcom to C++!\n"和分号(;)。每条语句应以分号(又称为语句终止符)结束。C++中的输出和输入是用字符流(stream)完成的,这样,执行上述语句时,将字符流"Welcom to C++!"发送到标准输出流对象(standard output stream object)cout,通常cout将其输出到屏幕。第11章“C++输入/输出流”中将详细介绍cout。
运算符<<称为流插入符(strem insertion operator)。执行这个程序时,运算符右边的值(历操作数)插入输出流中。历操作数通常按引号中的原样直接打印。但注意字符\n不在屏幕中打印。反斜杠(\)称为转义符(escap character),表示要输出特殊字符。字符串中遇到反斜杠时,下一个字符与反斜杠组合,形成转义序列(escape sequence)。转义序列\n表示换行符(newline)。使光标(即当前屏幕位置的指示符)移到下一行开头。表1.3列出了常用转义序列。
常见编程错误1.3
省略语句末尾的分号是个语法错误,语法错误编译器无法识别一个语句。编译器通常会发出错误消息,帮助程序员找到和纠正错误 。语法错误 即违反了语言规则。语法错误也称为编译错误,因为它们在编译阶段出现。
下列语句:
return 0; // indicate that program ended sucessfully
放在每个main函数的末尾。C++的关键字return 是退出函数的几种方式之一。main函数末尾使用return语句时,数值0表示顺利结束。第3章将详细介绍和解释包括这个语句的原因。目前只要记住在每个程序中都要包括这个语句。否则在某些程序中编译器会产生警告消息。
右花括号(})表示main函数结束。
------------------------------------------------------------------------------
转义序列 说明
------------------------------------------------------------------------------
\n 换行符,使屏幕光标移到屏幕中下一行开头
\t 水平制表符,使屏幕光标移到下一制表位
\r 回车符,使屏幕光标移到当前行开头,不移到下一行
\a 警告,发出系统警告声音
\\ 反斜杠,打印反斜杠符
\" 双引号,打印双引号
-------------------------------------------------------------------------------
图1.3 常用转义序列
编程技巧1.5
许多程序员让函数打印的最后一个字符为换行符(\n)。这样可以保证函数使屏幕光标移到屏幕中下一行开头,这种习惯能促进软件复用,这是软件开发环境中的关键目标。
编程技巧1.6
将每个函数的整个函数体在定义函数体的花括号中缩排一级,可使程序的函数结构更明显.使程序更易读。
编程技巧1.7
确定一个喜欢的缩排长度,然后一直坚持这个缩排长度。可以用制表符生成缩排,但制表位可能改变。建议用1/4英寸制表位或三个空格的缩排长度。
"Welcom to C++!"可用多种方法打印。例如,图1.4的程序用多条流插入语句,产生的程序输出与图1.2相同,因为每条流插人语句在上一条语句停止的位置开始打印。第一个流插入语句打印“Welcome”和空格,第二条流插入语句打印同一行空格后面的内容。C++允许以多种方式表达语句。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -