C++基础教程文档格式.docx
《C++基础教程文档格式.docx》由会员分享,可在线阅读,更多相关《C++基础教程文档格式.docx(145页珍藏版)》请在冰豆网上搜索。
以#标志开始的句子是预处理器的指示语句。
它们不是可执行代码,只是对编译器作出指示。
在本例中这个句子#include<
告诉编译器的预处理器将输入输出流的标准头文件(iostream.h)包括在本程序中。
这个头文件包括了C++中定义的基本标准输入-输出程序库的声明。
此处它被包括进来是因为在本程序的后面部分中将用到它的功能。
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()
{
"
HelloWorld"
;
也可以被写成:
intmain(){cout<
}
以上两段程序是完全相同的。
在C++中,语句的分隔是以分号(;
)为分隔符的。
分行写代码只是为了更方便人阅读。
以下程序包含更多的语句:
//mysecondprograminC++
I'
maC++program"
}
I'
maC++program
在这个例子中,我们在两个不同的语句中调用了cout<
函数两次。
再一次说明分行写程序代码只是为了我们阅读方便,因为这个main函数也可以被写为以下形式而没有任何问题:
HelloWorld!
mtoC++program"
为方便起见,我们也可以把代码分为更多的行来写:
"
cout
它的运行结果将和上面的例子完全一样。
这个规则对预处理器指示行(以#号开始的行)并不适用,因为它们并不是真正的语句。
它们由预处理器读取并忽略,并不会生成任何代码。
因此他们每一个必须单独成行,末尾不需要分号(;
)
注释(Comments)
注释(comments)是源代码的一部分,但它们会被编译器忽略。
它们不会生成任何执行代码。
使用注释的目的只是使程序员可以在源程序中插入一些说明解释性的内容。
C++支持两中插入注释的方法:
//linecomment
/*blockcomment*/
第一种方法为行注释,它告诉编译器忽略从//开始至本行结束的任何内容。
第二种为块注释(段注释),告诉编译器忽略在/*符号和*/符号之间的所有内容,可能包含多行内容。
在以下我们的第二个程序中,我们插入了更多的注释。
/*mysecondprograminC++
withmorecomments*/
//saysHelloWorld!
//saysI'
maC++program
如果你在源程序中插入了注释而没有用//符号或/*和*/符号,编译器会把它们当成C++的语句,那么在编译时就会出现一个或多个错误信息。
1.2变量和数据类型(VariablesandDatatypes)
你可能觉得这个“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)长
-32768到32767
0到65535
longint(long)
4
长整数(integer)32位(bits)长
-2147483648到2147483647
0到4294967295
int
整数(integer)
-2147483648到2147483647
0到4294967295
float
浮点数(floatingpointnumber)
3.4e+/-38(7个数字(7digits))
double
8
双精度浮点数(doubleprecisionfloatingpointnumber)
1.7e+/-308(15digits)
longdouble
长双精度浮点数(longdoubleprecisionfloatingpointnumber)
bool
布尔Boolean值。
它只能是真(true)或假(false)两值之一。
true或false
wchar_t
宽字符(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个整型变量,它与下面的写法完全等同:
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
//declaringvariables:
inta,b;
intresult;
//process:
a=5;
b=2;
a=a+1;
result=a-b;
//printouttheresult:
result;
//terminatetheprogram:
如果以上程序中变量声明部分有你不熟悉的地方,不用担心,我们在后面的章节中很快会学到这些内容。
变量的范围(Scopeofvariables)
所有我们要使用的变量都必须事先声明过。
C和C++语言的一个重要区别是,在C++语言中我们可以在源程序中任何地方声明变量,甚至可以在两个可执行(excutable)语句的中间声明变量,而不象在C语言中变量声明只能在程序的开头部分。
然而,我们还是建议在一定程度上遵循C语言的习惯来声明变量,因为将变量声明放在一处对debug程序有好处。
因此,传统的C语言方式的变量声明就是把变量声明放在每一个函数(function)的开头(对本地变量localvariable)或直接放在程序开头所有函数(function)的外面(对全局变量globalvariable)。
一个变量可以是本地(local)范围内有效,叫做本地变量,也可以是全局(global)范围内有效,叫做全局变量。
全局变量要定义在一个源码文件的主体中,所有函数(包括主函数main())之外。
而本地变量定义在一个函数甚至只是一个语句块单元中。
如下图所示:
全局变量Globalvariables可以在程序中任何地方任何函数(function)中被引用,只要是在变量的声明之后。
本地变量localvariables的作用范围被局限在声明它的程序范围内。
如果它们是在一个函数的开头被声明的(例如main函数),它们的作用范围就是整个main函数。
在左图的例子中,这就意味着如果在main函数外还另有一个函数,main函数中声明的本地变量(Age,ANumber,AnotherOne)不能够被另一个函数使用,反之亦然。
在C++中,本地变量(localvariable)的作用范围被定义在声明它的程序块内(一个程序块是被一对花括号(curlybrackets{})括起来的一组语句)。
如果变量是在一个函数(function)中被声明的,那么它是一个函数范围内的变量,如果变量是在一个循环中(loop)中被声明的,那么它的作用范围只是在这个循环(loop)之中,以此类推。
除本地和全局范围外,还有一种外部范围,它使得一个变量不仅在同一源程序文件中可见,而且在其他所有将被链接在一起的源文件中均可见。
变量初始化(Initializationofvariables)
当一个本地变量(localvariable)被声明时,它的值默认为未定(undetermined)。
但你可能希望在声明变量的同时赋给它一个具体的值。
要想达到这个目的,需要对变量进行初始化。
C++中有两种初始化方法:
第一种,又叫做类C(c-like)方法,是在声明变量的时候加上一个等于号,并在后面跟上想要的数值:
typeidentifier=initial_value;
例如,如果我们想声明一个叫做a的int变量并同时赋予它0这个值,我们可以这样写:
inta=0;
另外一种变量初始化的方法,又叫做构造函数(constructor)初始化,是将初始值用小括号(parenthesis())括起来:
typeidentifier(initial_value);
inta(0);
在C++.中以上两种方法都正确并且两者等同。
//变量初始化
iostream>
inta=5;
//初始值为5
intb
(2);
//初始值为2
//不确定初始值
a=a+3;
6
字符串(strings)
字符串是用来存储一个以上字符的非数字值的变量。
C++提供一个string类来支持字符串的操作,它不是一个基本的数据类型,但是在一般的使用中与基本数据类型非常相似。
与普通数据类型不同的一点是,要想声明和使用字符串类型的变量,需要引用头文件<
string>
,并且使用usingnamespace语句来使用标准名空间(std),如下面例子所示:
//C++字符串例题
using
namespacestd;
stringmystring="
Thisisastring"
mystring;
Thisisastring
如上面例子所示,字符串变量可以被初始化为任何字符串值,就像数字类型变量可以被初始化为任何数字值一样。
以下两种初始化格式对字符串变量都是可以使用的:
stringmystring="
Thisis