C++教程.docx
- 文档编号:23519220
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:172
- 大小:157.90KB
C++教程.docx
《C++教程.docx》由会员分享,可在线阅读,更多相关《C++教程.docx(172页珍藏版)》请在冰豆网上搜索。
C++教程
C++基础教程Beta版
原作:
JuanSoulié翻译:
JingXu
英文原版
本教程根据JuanSoulie的英文版C++教程翻译并改编。
本版为最新校对版,尚未定稿。
如有不明或错误之处,请参考英文原版,并敬请在本站留言指正。
版权归作者所有,欢迎链接,请勿转载。
本教程对C++语言进行了深入浅出的介绍,从基础知识到ANSI-C++标准的最新功能,内容涵盖了从数组,类等基本概念到多态、模板等高级概念。
教程本着实用的原则,每一小节都结合了可以工作的程序实例,以便读者从第一课开始就可以上手实习。
本翻译版本对许多C++概念中的关键词保留了中英文对照,以便读者增强理解,并方便日后阅读英文原版教材
目录
1.简介
怎样使用本教程
2.C++基础
BasicsofC++
1.C++程序结构
Structureofaprogram
2.变量,数据类型,常量
Variables.Datatypes.Constants
3.操作符/运算符
Operators
4.控制台交互
Communicationthroughconsole
3.控制结构和函数
ControlstructuresandFunctions
1.控制结构
ControlStructures
2.函数I
FunctionsI
3.函数II
FunctionsII
4.高级数据类型
AdvancedData
1.数组
Arrays
2.字符串
StringsofCharacters
3.指针
Pointers
4.动态内存分配
Dynamicmemory
5.数据结构
DataStructures
6.自定义数据类型
Userdefineddatatypes
5.面向对象编程
Object-orientedProgramming
1.类,构造函数和析构函数,类的指针
Classes.ConstructorsandDestructors.Pointerstoclasses.
2.操作符重载,this,静态成员
OverloadingOperators.this.Staticmembers
3.类之间的关系
Relationshipsbetweenclasses:
friend.Inheritance
4.虚拟成员,抽象,多态
VirtualMembers.Abstraction.Polymorphism
6.C++高级
Advancedconcepts
1.模板
Templates
2.名空间
Namespaces
3.出错处理
Exceptionhandling
4.类型转换高级
AdvacnedClassType-casting
5.预处理指令
PreprocessorDirectives
7.C++标准函数库
C++StandardLibrary
1.文件的输入输出
Input/Outputwithfiles
读者范围
本教程面向所有希望学习C++语言的读者。
如果读者有其他编程语言背景或计算机相关基本知识可以帮助更好的理解教程内容,但这并非必须条件。
对于C语言熟悉的读者可将前三章(1.1到3.4)当作复习,因为这部分内容主要介绍C++中的C部分。
第四章讲述面向对象编程。
第五章主要介绍ANSI-C++标准中的新增的功能。
本教程结构
教程共分6章,每章分若干小节。
你可以直接从主目录进入任意小节,并循每页底部的链接向后浏览。
很多小节含有一页例题介绍该章节主要知识点的使用。
建议在进入下一章学习之前最好先阅读这些例题,理解每行代码。
学习和练习一种编程语言的最好办法是自己修改书中例题程序,设法在程序中增加新的功能。
不要不敢修改这些例题程序,这正是学习的方法。
兼容性备注
ANSI-C++标准近几年来被接受为国际标准。
尽管C++语言从二十世纪80年代即存在,ANSI-C++在1997年才被发表。
因此很多编译器不支持ANSI-C++中的部分新功能,特别是那些在此标准发表前即被发布的编译器。
在本教程中,那些ANSI-C++中新增的而老一代C++编译器大多不支持概念将备用如下标志标出:
newinANSIC++
同样对于C和C++在实现上有明显不同的概念,将备用如下标志标出:
differentimplementationinCandC++
编译器
本教程中所有例题程序均为console程序(控制台程序)。
此类程序以文本形式与用户交换信息,显示结果。
所有C++编译器均支持console程序的编译。
要了解更多关于如何编译的说明,请查询你的编译器用户使用手册。
.1C++程序结构(Structureofaprogram)
下面我们从一个最简单的程序入手看一个C++程序的组成结构。
//myfirstprograminC++
#include
usingnamespacestd;
intmain(){
cout<<“HelloWorld!
”;
return0;
}
HelloWorld!
上面左侧显示了我们的第一个程序的源代码,代码文件名称为hellowworld.cpp。
右边显示了程序被编译执行后的输出结果。
编辑和编译一个程序的方法取决于你用的是什么编译器,根据它是否有图形化的界面及版本的不同,编译方法也有可能不同,具体请参照你所使用的编译器的使用说明。
以上程序是多数初学者学会写的第一个程序,它的运行结果是在屏幕上打出”HelloWorld!
”这句话。
虽然它可能是C++可写出的最简单的程序之一,但其中已经包含了每一个C++程序的基本组成结构。
下面我们就逐个分析其组成结构的每一部分:
//myfirstprograminC++
这是注释行。
所有以两个斜线符号(//)开始的程序行都被认为是注释行,这些注释行是程序员写在程序源代码内,用来对程序作简单解释或描述的,对程序本身的运行不会产生影响。
在本例中,这行注释对本程序是什么做了一个简要的描述。
#include
以#标志开始的句子是预处理器的指示语句。
它们不是可执行代码,只是对编译器作出指示。
在本例中这个句子#include
这个头文件包括了C++中定义的基本标准输入-输出程序库的声明。
此处它被包括进来是因为在本程序的后面部分中将用到它的功能。
usingnamespacestd;
C++标准函数库的所有元素都被声明在一个名空间中,这就是std名空间。
因此为了能够访问它的功能,我们用这条语句来表达我们将使用标准名空间中定义的元素。
这条语句在使用标准函数库的C++程序中频繁出现,本教程中大部分代码例子中也将用到它。
intmain()
这一行为主函数(mainfunction)的起始声明。
mainfunction是所有C++程序的运行的起始点。
不管它是在代码的开头,结尾还是中间–此函数中的代码总是在程序开始运行时第一个被执行。
并且,由于同样的原因,所有C++程序都必须有一个mainfunction。
main后面跟了一对圆括号(),表示它是一个函数。
C++中所有函数都跟有一对圆括号(),括号中可以有一些输入参数。
如例题中显示,主函数(mainfunction)的内容紧跟在它的声明之后,由花括号({})括起来。
cout<<“HellowWorld!
”;
这个语句在本程序中最重要。
cout是C++中的标准输出流(通常为控制台,即屏幕),这句话把一串字符串(本例中为”HelloWorld”)插入输出流(控制台输出)中。
cout在的声明在头文件iostream.h中,所以要想使用cout必须将该头文件包括在程序开始处。
注意这个句子以分号(;)结尾。
分号标示了一个语句的结束,C++的每一个语句都必须以分号结尾。
(C++程序员最常犯的错误之一就是忘记在语句末尾写上分号)。
return0;
返回语句(return)引起主函数main()执行结束,并将该语句后面所跟代码(在本例中为0)返回。
这是在程序执行没有出现任何错误的情况下最常见的程序结束方式。
在后面的例子中你会看到所有C++程序都以类似的语句结束。
你可能注意到并不是程序中的所有的行都会被执行。
程序中可以有注释行(以//开头),有编译器预处理器的指示行(以#开头),然后有函数的声明(本例中main函数),最后是程序语句(例如调用cout<<),最后这些语句行全部被括在主函数的花括号({})内。
本例中程序被写在不同的行中以方便阅读。
其实这并不是必须的。
例如,以下程序
intmain()
{
cout<<"HelloWorld";
return0;
}
也可以被写成:
intmain(){cout<<"HelloWorld";return0;}
以上两段程序是完全相同的。
在C++中,语句的分隔是以分号(;)为分隔符的。
分行写代码只是为了更方便人阅读。
以下程序包含更多的语句:
//mysecondprograminC++
#include
intmain()
{
cout<<"HelloWorld!
";
cout<<"I'maC++program";
return0;}
HelloWorld!
I'maC++program
在这个例子中,我们在两个不同的语句中调用了cout<<函数两次。
再一次说明分行写程序代码只是为了我们阅读方便,因为这个main函数也可以被写为以下形式而没有任何问题:
intmain(){cout<<"HelloWorld!
";cout<<"I'mtoC++program";return0;}
为方便起见,我们也可以把代码分为更多的行来写:
intmain()
{
cout<<
"HelloWorld!
";
cout
<<"I'maC++program";
return0;
}
它的运行结果将和上面的例子完全一样。
这个规则对预处理器指示行(以#号开始的行)并不适用,因为它们并不是真正的语句。
它们由预处理器读取并忽略,并不会生成任何代码。
因此他们每一个必须单独成行,末尾不需要分号(;)
注释(Comments)
注释(comments)是源代码的一部分,但它们会被编译器忽略。
它们不会生成任何执行代码。
使用注释的目的只是使程序员可以在源程序中插入一些说明解释性的内容。
C++支持两中插入注释的方法:
//linecomment
/*blockcomment*/
第一种方法为行注释,它告诉编译器忽略从//开始至本行结束的任何内容。
第二种为块注释(段注释),告诉编译器忽略在/*符号和*/符号之间的所有内容,可能包含多行内容。
在以下我们的第二个程序中,我们插入了更多的注释。
/*mysecondprograminC++
withmorecomments*/
#include
intmain()
{
cout<<"HelloWorld!
";//saysHelloWorld!
cout<<"I'maC++program";//saysI'maC++program
return0;
}
HelloWorld!
I'maC++program
如果你在源程序中插入了注释而没有用//符号或/*和*/符号,编译器会把它们当成C++的语句,那么在编译时就会出现一个或多个错误信息。
.2变量,数据类型,常量(Variables.Datatypes.Constants)
你可能觉得这个“HellowWorld”程序用处不大。
我们写了好几行代码,编译,然后执行生成的程序只是为了在屏幕上看到一句话。
的确,我们直接在屏幕上打出这句话会更快。
但是编程并不仅限于在屏幕上打出文字这么简单的工作。
为了能够进一步写出可以执行更有用的任务的程序,我们需要引入变量(variable)这个的概念。
让我们设想这样一个例子,我要求你在脑子里记住5这个数字,然后再记住2这个数字。
你已经存储了两个数值在你的记忆里。
现在我要求你在我说的第一个数值上加1,你应该保留6(即5+1)和2在你的记忆里。
现在如果我们将两数相减可以得到结果4。
所有这些你在脑子里做的事情与计算机用两个变量可以做的事情非常相似。
同样的处理过程用C++来表示可以写成下面一段代码:
a=5;
b=2;
a=a+1;
result=a-b;
很明显这是一个很简单的例子,因为我们只用了两个小的整数数值。
但是想一想你的电脑可以同时存储成千上万这样的数值,并进行复杂的数学运算。
因此,我们可以将变量(variable)定义为内存的一部分,用以存储一个确定的值。
每一个变量(variable)需要一个标识,以便将它与其他变量相区别,例如,在前面的代码中,变量标识是a,b,和result。
我们可以给变量起任何名字,只要它们是有效的标识符。
标识(Identifiers)
有效标识由字母(letter),数字(digits)和下划线(_)组成。
标识的长度没有限制,但是有些编译器只取前32个字符(剩下的字符会被忽略)。
空格(spaces),标点(punctuationmarks)和符号(symbols)都不可以出现在标识中。
只有字母(letters),数字(digits)和下划线(_)是合法的。
并且变量标识必须以字母开头。
标识也可能以下划线(_)开头,但这种标识通常是保留给为外部连接用的。
标识不可以以数字开头。
必须注意的另一条规则是当你给变量起名字时不可以和C++语言的关键字或你所使用的编译器的特殊关键字同名,因为这样与这些关键字产生混淆。
例如,以下列出标准保留关键字,他们不允许被用作变量标识名称:
asm,auto,bool,break,case,catch,char,class,const,const_cast,continue,default,delete,do,double,dynamic_cast,else,enum,explicit,extern,false,float,for,friend,goto,if,inline,int,long,mutable,namespace,new,operator,private,protected,public,register,reinterpret_cast,return,short,signed,sizeof,static,static_cast,struct,switch,template,this,throw,true,try,typedef,typeid,typename,union,unsigned,using,virtual,void,volatile,wchar_t,while
另外,不要使用一些操作符的替代表示作为变量标识,因为在某些环境中它们可能被用作保留词:
and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq
你的编译器还可能包含一些特殊保留词,例如许多生成16位码的编译器(比如一些DOS编译器)把far,huge和near也作为关键字。
非常重要:
C++语言是“大小写敏感”(“casesensitive”)的,即同样的名字字母大小写不同代表不同的变量标识。
因此,例如变量RESULT,变量result和变量Result分别表示三个不同的变量标识.
基本数据类型(FundamentalDatatypes)
编程时我们将变量存储在计算机的内存中,但是计算机要知道我们要用这些变量存储什么样的值,因为一个简单的数值,一个字符,或一个巨大的数值在内存所占用的空间是不一样的。
计算机的内存是以字节(byte)为单位组织的。
一个字节(byte)是我们在C++中能够操作的最小的内存单位。
一个字节(byte)可以存储相对较小数据:
一个单个的字符或一个小整数(通常为一个0到255之间的整数)。
但是计算机可以同时操作处理由多个字节组成复杂数据类型,比如长整数(longintegers)和小数(decimals)。
以下列表总结了现有的C++基本数据类型,以及每一类型所能存储的数据范围:
数据类型(DATATYPES)
名称
字节数
描述
范围
char
1
字符(character)或整数(integer),8位(bits)长
有符号(signed):
-128到127
无符号(unsigned):
0到255
shortint(short)
2
短整数(integer)16位(bits)长
有符号(signed):
-32768到32767
无符号(unsigned):
0到65535
longint(long)
4
长整数(integer)32位(bits)长
有符号(signed):
-2147483648到2147483647
无符号(unsigned):
0到4294967295
int
4
整数(integer)
有符号(signed):
-2147483648到2147483647
无符号(unsigned):
0到4294967295
float
4
浮点数(floatingpointnumber)
3.4e+/-38(7个数字(7digits))
double
8
双精度浮点数(doubleprecisionfloatingpointnumber)
1.7e+/-308(15digits)
longdouble
8
长双精度浮点数(longdoubleprecisionfloatingpointnumber)
1.7e+/-308(15digits)
bool
1
布尔Boolean值。
它只能是真(true)或假(false)两值之一。
true或false
wchar_t
2
宽字符(Widecharacter)。
这是为存储两字节(2bytes)长的国际字符而设计的类型。
一个宽字符(1widecharacters)
*字节数一列和范围一列可能根据程序编译和运行的系统不同而有所不同。
这里列出的数值是多数32位系统的常用数据。
对于其他系统,通常的说法是整型(int)具有根据系统结构建议的自然长度(即一个字oneword的长度),而4中整型数据char,short,int,long的长度必须是递增的,也就是说按顺序每一类型必须大于等于其前面一个类型的长度。
同样的规则也适用于浮点数类型float,double和longdouble,也是按递增顺序。
除以上列出的基本数据类型外,还有指针(pointer)和void参数表示类型,我们将在后面看到。
变量的声明(Declarationofvariables)
在C++中要使用一个变量必须先声明(declare)该变量的数据类型。
声明一个新变量的语法是写出数据类型标识符(例如int,short,float...)后面跟一个有效的变量标识名称。
例如:
inta;
floatmynumber;
以上两个均为有效的变量声明(variabledeclaration)。
第一个声明一个标识为a的整型变量(intvariable),第二个声明一个标识为mynumber的浮点型变量(floatvariable)。
声明之后,我们就可以在后面的程序中使用变量a和mynumber了。
如果你需要声明多个同一类型的变量,你可以将它们缩写在同一行声明中,在标识之间用逗号(comma)分隔。
例如:
inta,b,c;
以上语句同时定义了a、b、c3个整型变量,它与下面的写法完全等同:
inta;
intb;
intc;
整型数据类型(char,short,long和int)可以是有符号的(signed)或无符号的(unsigned),这取决于我们需要表示的数据范围。
有符号类型(signed)可以表示正数和负数,而无符号类型(unsigned)只能表示正数和0。
在定义一个整型数据变量时可以在数据类型前面加关键字signed或unsigned来声明数据的符号类型。
例如:
unsignedshortNumberOfSons;
signedintMyAccountBalance;
如果我们没有特别写出signed或unsigned,变量默认为signed,因此以上第二个声明我们也可以写成:
intMyAccountBalance;
因为以上两种表示方式意义完全一样,因此我们在源程序通常省略关键字signed。
唯一的例外是字符型(char)变量,这种变量独立存在,与signedchar和unsignedchar型均不相同。
short和long可以被单独用来表示整型基本数据类型,short相当于shortint,long相当于longint。
也就是说shortyear;和shortintyear;两种声明是等价的。
最后,signed和unsigned也可以被单独用来表示简单类型,意思分别同signedint和unsignedint相同,即以下两种声明互相等同:
unsignedMyBirthYear;
unsignedintMyBirthYear;
下面我们就用C++代码来解决在这一节开头提到的记忆问题,来看一下变量定义是如何在程序中起作用的。
//operatingwithvariables
#include
usingnamespacestd;
intmain()
{
//declaringvariables:
inta,b;
intresult;
//process:
a=5;
b=2;
a=a+1;
result=a-b;
//printouttheresult:
cout< //terminatetheprogram: return0; } 4 如果以上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 教程