c++基础教程Beta版原作:JuanSoulie翻译:JingXu(aqua)英文原版本教程根据JuanSoulie的英文版c++教程翻译并改编。本版为最新校对版,尚未定稿。如有不明或错误之处,请参考英文原版,并敬请在本站留言指正。版权归作者所苟,欢迎链攘,请勿转载。本教手B才C++语言进行了深入浅出的介绍,从基础知识到ANSI-C++标准的最新功能,内窑涵盖了从数组,类等基本概念到多态、模板等高级概念。教程本着实用的原则,每一小节都结合了可以工作的程序实例,以便读者从第一课开始就可以上手实习。本翻译版本对许多c++概念中的关键词保留了中英文对照,以便读者增强理解,并方便日后阅读英文原版教材目录1.简介怎样使用本教程2.c++基础BasicsofC++1.c++程序结构Structureofaprogram2.变量和数据类型VariablesandDa恒types3.常量Constants4.操作符/运算符Operators5.控制台交ECommunicationthroughconsole1/1793.控制结构和函数Con甘olstructuresandFunctions1.控制结构ControlStructures2.函数IFunctionsI3.函数IIFunctionsII4.高级数据类型AdvancedData1.数组Arrays2.字符序列CharacterSequences3.指针Pointers4.动态内存分配Dynamicmemory5.数据结构DataStructures6.自定义数据类型Userdefinedda恒types5.面向对象编程。均ect-orient,创Programming1.类,构造函数和析梅函数,类的指针Classes.ConstructorsandDestructors.Pointerstoclasses.2/1792.操作符重载,this,静态成员OverloadingOperators.this.Staticmembers3.类之间的关系Relationshipsbetweenclasses:friend.Inheritance4.虚拟成员,抽象,多态VirtualMembers.Abstraction.Polymorphism6.c++高级Advancedconcep恒1.模板Templates2.名空间Namespaces3.出错处理Exceptionhandling4.类型转换高级AdvacnedClassType-casting5.r.败t理指令PreprocessorDirectives7.c++标准函数库C++StandardLibrary1.文件的输入输出Input/Outputwithfilesc++基础教程简介怎样使用本教程读者范围3/179本教程面向所有希望学习c++语言的读者。如果读者有真他编程语言背景或计算机相关基本知识可以帮助更好的理解教程内窑,但这并非必须条件。对于C语言熟恶的读者可将前三章(1.1到3.4)当作复习,因为这部分内窑主要介绍c++中的C部分。不过某些c++的语法与C还是有些差别,所以建议还是快速的读一下这部分。第四章讲述面向对象编程。第五章主要介绍ANSl-C++标准中的新增的功能。本教程结构教程共分6章,每重分若干小节。你可以直接从主目录进入任意小节,并循每页底部的链接向后浏览。很多小节含有一页例题介绍该章节主要知识J苟的使用。建议宿韭入下一章学习之前最好先阅读这些例题,理解每行代码。学习和练习一种编程语言的最好办法是自己修改书中例题程序,设法在程序中增加新的功能。不要不敢修改这些例题程序,这正是学习的方法。兼窑性备注ANSl-C++标准近几年来被接受为国际标准。尽筐c++语言从二十世纪80军代即存在,ANSl-C++在1997年才被发表,2003年又被修订过。因此很多编译器不支持ANSl-C++中的部分新功能,特别是那些在此标准发表前即被发布的编译器。在本教程中,那些ANSl-C++中新增的而老→tc++编译器大多不支持概念将备用如下标志标出:ANSIC++新增的概念同样对于C和c++在实现上有明显不同的概念,将备用如下标志标出:C与c++不同的地方编译器本教程中所有例题程序均为console程序(控制台程序)。此类程序以文本形式与用户交换信息,显示结果。4/179所高c++编译器均支持console程序的编译。要了解更多关于如何编译的说明,清查询你的编译器用户使用手册。c++编译器和开发环境推荐很多读者询问编译器和开发环境的问题。除了常用的商用收费的MSVisualStudio,VC++,BorlandC++等工具外,还有很多免费的工具也是很好用的。这里推荐两种免费的c++开发软件:1、Eclipse的CDT开发工具,官方网站在阳p://、开源工具Dev-c++和wxDev-c++第-章c++基础知识(BasicsofC++)1.c++手里事结构Structureofaprogram2.变量和数据类型VariablesandDatatypes3.常量Constan恒4.操作符/运算符Operators5.控制台交ECommunicationthroughconsolei.1c++程序结构(Structureofaprogram)下面我们从一个最简单的程序入手看一个c++程序的组成结构。IImyfirstprograminC++#includeiostream.husingnamespacestd;intmain(){5/179cout<<、、HelloWorld!”;returnO;}HelloWorld!上面左侧显示了我们的第一个程序的源代码,代码文件名称为hellowworld.cpp。右边显示了程序被编译执行后的输出结果。编辑辞日编译一个程序的方法取决于你用的是什么编译器,根据它是否有图形化的界面及版本的不同,编译方法也有可能不同,具体请参照你所使用的编译器的使用说明。以上程序是多数初学者学会写的第一个自芋,宫的运行结果是在屏幕上打出”HelloWorld!”这句话。虽然白可能是c++可写出的最简单的相事之一,但真中已经包含了每一个C++程序的基本组成结构。下面我们就逐个分析真组成结构的每一部分:11myfirstprograminc++这是注释行。所高以两个斜线符号UI)开始的周宇行都被认为是注释行,这些注释行是程序员写在程序源代码内,用来又挤到事作简单解释或描述的,又才幸自事本身的运行不会产生影响.在本例中,这行注释对本程序是什么做了一个简要的描述。#includeiostream.h以#标志开始的句子是预处理器的指示语句。官们不是可执行代码,只是对编译器作出指示。在本例中这个句子#includeiostream.h>告诉编译器的预处理器将输入输出流的标准头文件(iostream.h)包括在本程序中。这个头文件包括了c++中定义的基本标准输入-输出程序库的声明。此处E被包括进来是因为在本程序的后面部分中将用到宫的功能。usingnamespacestd;c++标准函数库的所有元素都被声明在一个名空间中,这就是std名空间。因此为了能够访问它的功能,我们用这条语句来表达我们将使用好准名空间中定义的元素。这条语句在使用标准函数库的c++程序中频繁出现,本教程中大部分代码例子中也将用到宫。(iostream.h与iostream的不同。#includeiostream.h>是在旧的标准C++中使用。在新标准中,用#includeiostreamoiostream的意思是输入输出流。#includeiostream>是标准的C++兰主企,任何符合标准的C++主主主望都有这个头文件。还要注意的是:在旦旦编程时要添加:6/179usingnamespacestd;其原因是:后缀为.h的头文件C++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在C中调用庄且犁,使用的是全局命名空间,也就是早期的C++实现;当使用<iostream>的时候,该主主企没有定义全局命名空间,必须使用namespacestd:这样才能正确使用cout。)intmainQ这一行为主函数(mainfunction)的起始声明。mainfunction是所有c++程序的运行的起始点。不管它是在代码的开头,结尾还是中间,此函数中的代码总是在程序开始运行时第一个被执行。并且,由于同样的原因,所有c++程序都必须有一个mainfunction。main后面跟了一对圆括号(),表示宫是一个函数。c++中所有函数都眼有一对圆括号(),括号中可以有一些输入参数。如例题中显示,主函数(main仙nction)的内窑紧跟在宫的声明之后,由花插号({})括起来。coutHellowWorld!”;这个语句在本程序中最重要。cout是c++中的标准输出流(通常为控制台,即屏幕),这句话把一串字符串(本例中为”HelloWorld)插入输出流(控制台输出)中。cout在的声明在头文件iostream.h中,所以要想使用cout必须将该头文件包插在:~~事开始处。注意这个句子以分号(;)结尾。分号标示了一个语句的结束,c++的每一个语句都必须以分号结尾。(C++程序员最常犯的错误之一就是L忘记在语句末尾写上分号)。returnO;返回语句(return)引起主函数main()执行结束,并将该语句后面所跟代码(在本例中为0)返回。这是在程序执行没有出现倒可错误的情况下最常见的程序结束方式。在后面的例子中你会看到所有c++程序都以类似的语句结束。你可能注意到并不是程序中的所有的行都会被执行。程序中可以有注释行(以//开头),有编译器预处理器的揭示行(以#开头),然后有函数的声明(本例中main函数),最后是程序语句(例如调用cout《),最后这些语句行全部被括在主函数的花括号({})内。7/179本例中程序被写在不同的行中以方便阅读。真实这并不是必须的。例如,以下程序intmain()cout”HelloWorld”;returnO;}也可以被写成:intmain(){cout”HelloWorld”;returnO;}以上两段程序是完全相同的。在c++中,语旬的分隔是以分号(;)为分隔符的。分行写代码只是为了更方便人阅读。以下程序包含更多的语句:IImysecondprograminC++#includeiostream.hintmain()cout”HelloWorld!”;cout《吨’maC++program”;returnO;}HelloWorld!I’mac++program在这个例子中,我们在两个不同的语句中调用了cout《函数两次。再一次说明分行写程序代码只是为了我们阅读方便,因为这个main函数也可以被写为以下形式而没有任何问题:intmain(){cout”HelloWorld!”;cout”I’mtoc++program”;returnO;}8/179为方便起见,我们也可以把代码分为更多的行来写:intmain()cout吁~elloWorld!”;coutI'mac++prog「am”;returnO;}巴的运行结果将和上面的例子完全一样。这个规则对预处理器指示行(以#号开始的行)并不适用,因为2们并不是真正的语句。'Bff〕由预处理器读取并忽略,并不会生成任何代码。因此他们每一个必须单独成行,末尾不需要分号(;)注释(Cornmen恒)注释(commen恒)是源代码的一部分,但官们会被编译器忽略。官们不会生成任何执行代码。使用注释的目的只是使程序员可以在溯到事中插入一些说明解释性的内'*'-e-。c++支持两中插入注释的方法:11linecommentI*blockcomment*I第一种方法为行注