版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计语言C+电子科技大学计算机学院 陈文宇 1第二章 C+语法 2.1 C+程序概貌第一个C+程序#include /包含ANSI C+头文件 void main( )cout “Hello, world!” endl; /输出字符串2#include /包含ANSI C+库文件 void main( )std:cout “Hello, world!” std: endl; #include /包含ANSI C+库文件using namespace std; /使用预定义的名字空间stdvoid main( )cout “Hello, world!” endl; 第二章 C+语法
2、2.1 C+程序概貌2.1.1 ISO/ANSI C+库文件库文件 程序的第一行是#include 。#include是一条编译预处理指令,它的作用是在源文件中插入iostream文件所包含的所有源代码。 iostream文件是标准标准C+的一个的一个库文件。 5 C语言的头文件都有后缀.h,C+语言可以直接使用这些带.h后缀的头文件。 为避免命名的冲突,ISO/ANSI C+标准将每一个C语言的头文件对应地改造为一个库文件(文件名仅仅是将原文件的.h去掉), 并将该文件中定义的标识符定义在标准的名字std中。第二章 C+语法 2.1 C+程序概貌2.1.2 名字空间名字空间 包含头文件ios
3、tream的目的是为了使用标准输出流cout和endl 。 通过using namespace std语句来引入名为std的名字空间。7第二章 C+语法 2.1 C+程序概貌2.1.2 名字空间名字空间可以自定义名字空间,语法如下:namespace std /std是一个名字空间的名字/这里声明了常量、变量、数据类型等等8第二章 C+语法2.1 C+程序概貌2.1.2 名字空间名字空间 一旦一个标识符,例如ken,被定义在一个名字空间里,那么它就被隐藏在了那个名字空间里。 也就是说,ken只能被包含在那个名字空间里的语句直接访问。 试图在名字空间之外访问ken会得到一个编译器找不到标识符的错
4、误。9第二章 C+语法 2.1 C+程序概貌2.1.2 名字空间名字空间解决问题的方案有两个:1.使用名字限定符std:cout “Hello, world!” ”和“变量名; “”在C语言中是右移运算符,在C+语言中,如果第一个操作数为cin,它就是输入运算符。 输出格式为: 变量 cout 表达式 常量(各种类型常量均可) “”在C语言中是左移运算符,在C+语言中,如果第一个操作数为cout,它就是输出运算符。 输入和输出运算符可以连用。第二章 C+语法 2.1 C+程序概貌2.1.5 注释注释 为程序加入适当的注释是非常有价值的,因为这些注释可以为我们阅读程序提供帮助。C+具有C的多行风
5、格注解。使用“/*”开始,直到“*/”结束,可以注解多行,但不允许嵌套。C+也提供一种新的表示注解的方法,Comment_to_end_of_line的结构,使用“/”开始,直到行尾结束。 14第二章 C+语法2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型1. 整型 C+整数类型包括字符型char、短整型short、整型int和长整型long。 下面的这些数的类型都属于整数类型:-128,-30,0,64,65535,68071215第二章 C+语法 2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型1.整型可以用到的整数类型有8种:char, sh
6、ort, int, long, unsigned char, unsigned short, unsigned int, unsigned long其中,unsigned int可以简写为unsigned。16第二章 C+语法 2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型2. 字符型字符型char是一种特别的整数类型。 字符型数据在内存中是以ASCII码的形式存储的。由于字符的存储值ASCII码是个整数,因此在某些情况下我们会把字符数据当作整型数据来参与运算。17第二章 C+语法 2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型2. 字符型C+的
7、转意字符序列。比如,n并不代表字符n,而是表示新行(new line)。这里符号(反斜杆)叫做转意字符,意思是跟在它后面的字符不再是原来的含义,而是具有其它的含义。如果当要用到符号本身,需要把它写成。18第二章 C+语法 2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型3. 布尔型布尔型bool是一种特殊的内建整数类型,因为它采用与整数相同的存储方式。不过,布尔类型的表达范围非常有限,只能取false和true两个值。这是两个C+的关键字,而且是两个字符常量标识符,并不是字符串。19第二章 C+语法2.2 C+的内建(Built-in)类型2.2.1 整数类型整数类型3.
8、 布尔型 应该注意的是,虽然这里把bool类型归为整数类型,但这并不等于我们可以把它当作整数使用。 bool类型主要用来表达一种逻辑真或假的状态,它的含义和用途与整数是完全不同的。20第二章 C+语法 2.2 C+的内建(Built-in)类型2.2.2 浮点类型浮点类型浮点数指的是带有小数部分的数,用来表示数学意义上的实数。实数的表示是:整数部分 . 小数部分其中小数部分看起来也是个整数。除了小数点,整数部分和小数部分可以缺省,但不能两者都缺。下面是一些浮点数的例子:3.14159,-123.45,0.957,6.,.221第二章 C+语法2.2 C+的内建(Built-in)类型2.2.2
9、 浮点类型浮点类型C+的浮点类型有三种:float、double、long double。 由于所有的计算机都是用二进制的方式来存储数据的,因此这影响了浮点数的表示精度,浮点数的存储值和实际值是有很微小的差别的。 如何判断两个浮点型变量的值是否相等? 22第二章 C+语法2.3 变量和命名常量2.3.1 标识符标识符 为了使C+程序更加易读易写,我们会用一些有意义的名字来标识程序元素,比如数据、函数等等。那些用来标识程序元素的名字就是标识符。使用自定义标识符也是所有高级语言的特征。 标识符是由字母A-Z,a-z和数字0-9混合而成的,另外可以加入下划线_。不过,所有的标识符必须以字母或者是下划
10、线_开头。23第二章 C+语法 2.3 变量和命名常量2.3.1 标识符标识符命名一个标识符的时候,遵循一些常用的约定:1.取一个有意义的名字。2.如果名字由多个单词组成,那么每个单词的第一个字母用大写。(C+是大小写敏感的语言)3.使用匈牙利记号。匈牙利记号是一种前缀,其做法是在标识符的前面加上一个小写字母以示其数据类型。24第二章 C+语法 2.3 变量和命名常量2.3.2 变量声明变量声明下面是变量声明的例子:charcData;boolbFlag;intiPage, nCount;doublefDelta; 25第二章 C+语法2.3 变量和命名常量2.3.2 变量声明变量声明 一旦声
11、明了一个变量,这个变量在运行时就会在内存中占据一定大小的空间。例如声明变量iPage在内存中的映像如下图所示:26iPage0 x0013FF78内存单元的符号名内存单元的32位地址内存单元的大小在32位机上是4字节第二章 C+语法2.3 变量和命名常量2.3.3 常量(常量(Named Constant)和)和const关键字关键字1. 常量 一些常量(字面常量)和所属类型的例子:10(int)077L(long)0 xABCDu (unsigned int)9.78f(float)7905.30 (double)A(char)27第二章 C+语法2.3 变量和命名常量2.3.3 常量(常量
12、(Named Constant)和)和const关键字关键字2. 命名常量使用字面常量省掉了占用内存单元的开销,但也有一些缺点:在多处使用了相同的字面常量,而后来又要对这个常量进行修改时就会显得非常麻烦;字面常量没有明确的类型信息,它们的类型采用编译器的约定。28第二章 C+语法2.3 变量和命名常量2.3.3 常量(常量(Named Constant)和)和const关键字关键字2. 命名常量 为了解决上述的问题,可以使用C风格的没有参数的宏定义: #define PI 3.14 PI并不是真正的符号常量。 仅是一个字符串,没有类型,不占用存储空间,不能取它的地址。 29第二章 C+语法2.
13、3 变量和命名常量2.3.3 常量(常量(Named Constant)和)和const关键字关键字2. 命名常量C+提供灵活的命名常量方式来描述常数:const float PI = 3.14; PI成为一个真正的符号常量,有类型,需要占用存储空间(存放在常量数据区)。 PI的值不能被修改。 30第二章 C+语法2.3 变量和命名常量2.3.4 易变变量和易变变量和volatile关键字关键字 在程序中使用某些变量,很容易被改变。这很容易造成程序在某一时刻用到的该变量的值并不是它此刻真正的值。C+引入了“易变变量(Volatile Variable)”的概念。C+使用volatile关键字来
14、约束一个变量,以警告编译器这是一个易变变量:volatile int nSharedData;31第二章 C+语法2.4 用户自定义类型32C+的数据类型地址类型简单类型结构类型整数类型布尔型 bool字符型 unsigned char短整型 unsigned short整型 unsigned int长整型 unsigned long浮点类型单精度浮点型 float双精度浮点型 double长双精度浮点型long double枚举类型 enum指针类型 pointer引用类型 reference数组 array结构 struct联合 union类 class第二章 C+语法2.4 用户自定义类
15、型2.4.1 枚举枚举用宏来定义一系列表示状态的常量有明显的缺陷,就是没有类型信息。C+提供了一种更好的解决方案,就是使用枚举类型:enum TrafficLight RED, GREEN, AMBER ; 标识符RED、GREEN、AMBER被称为枚举常量,它们不是字符串,也不是整型常量。另外,枚举常量是有序的。 33第二章 C+语法2.4 用户自定义类型2.4.2 数组数组1. 一维数组一维数组的定义如下:TYPE array整型常量;34第二章 C+语法2.4 用户自定义类型2.4.2 数组数组2. 二维数组在处理像矩阵这样的二维阵列(这正是array这个词汇的原意)时,使用二维数组 c
16、onst int ROW = 3; const int COL = 5; int arrROWCOL;35第二章 C+语法2.4 用户自定义类型2.4.2 数组数组3.一维字符数组 一维字符数组往往被用来表示字符串。不过,数组最后一个有效字符的后面必须是个结束标记。 这样的字符串被称为ASCIZ字符串。char szName = K, e, n, 0 ; 36第二章 C+语法2.4 用户自定义类型2.4.3 结构和联合结构和联合1.结构 struct 数组是相同类型数据的集合。当要把不同类型的数据集合在一起时,会用到结构struct。37第二章 C+语法2.4 用户自定义类型2.4.3 结构和
17、联合结构和联合结构 的例子struct Employee intnID;/工号char szName30;/姓名charcGender;/性别short nDOB;/出生年份intnDeptID;/工作部门号; 38第二章 C+语法2.4 用户自定义类型2.4.3 结构和联合结构和联合2.联合union 联合的定义类似于结构的定义; 联合和结构的不同之处在于,联合变量的每个成员都共享同样的内存单元。一个联合变量的大小实际上是它占据内存最多的那个成员的大小。39第二章 C+语法2.4 用户自定义类型2.4.4 指针指针 指针是另外一个变量的地址,通过这个地址可以间接地访问到那个变量。 int n
18、Unit; int * pi = &nUnit; 符号*表明了变量pi是一个指针变量;运算符&的功能是取变量nUnit的地址。这样,pi单元的内容就是nUnit单元的地址。 40第二章 C+语法2.4 用户自定义类型2.4.4 指针指针 由于指针是地址,因此所有指针单元的大小都是一样的。但是,这并不意味的两个指针变量可以互相赋值,因为指针是有类型之分的。41 指针类型可以看作有两部分组成:首先它是个指针(值为地址);其次,指针变量指向了一个特定类型的变量。 float * pf; 第二章 C+语法2.4 用户自定义类型2.4.4 指针指针 指针和常量修饰符const const
19、也可以与指针一起使用,它们的组合情况复杂一些,可归结为三种: 指向常量的指针 常指针 指向常量的常指针。 43指向常量的指针 const TYPE * pc; pc指向的单元不能改变,但pc可以改变常指针 TYPE * const cp=; cp不能改变,但它指向的单元可以改变指向常量的常指针 const TYPE * const cpc=; cpc指向的单元不能改变,cpc不可以改变第二章 C+语法2.4 用户自定义类型2.4.5 引用引用 引用就是给一个变量取一个别名。 也就是说,引用与它所引用的变量实际上是同一个单元(共享存储单元)共享存储单元)。 45 引用主要有以下三个用途:引用主要
20、有以下三个用途:()独立引用;()独立引用;()作为参数传递;()作为参数传递;()作为返回类型。()作为返回类型。 表示为表示为 TYPE &TYPE &,它的含义为它的含义为“ “ TYPE TYPE 类型的引用类型的引用”。 TYPE &TYPE & ref_nameref_name = TYPE = TYPE 的一个变量;的一个变量; 例如:例如: intint i; i; intint & j = i; & j = i; 1 独立引用独立引用 还可以定义常引用。还可以定义常引用。 const const intint & &am
21、p; rxrx=100 ;=100 ; 一般来说,独立引用没有什么实际用途。一般来说,独立引用没有什么实际用途。 引用的主要用途是引用的主要用途是 函数形参是引用函数形参是引用 函数返回引用函数返回引用2 引用作为函数参数 C语言采用传值(call by value)方式进行参数传递。 当一个函数需要修改对应的实参的值时,参数应明确声明为指针类型。void fun(int num) num=100;void main( ) int annum=10; fun(annum); coutannum;输出10实参与形参的传递方式为:int num=annum void fun(int * p)*p=
22、100;void main( ) int annum=10; fun(&annum); coutannum;输出100实参与形参的传递方式为:int *p=&annumvoid fun(int &num)num=100;void main( ) int annum=10; fun(annum); cout = = = !=(not_eq)逻辑运算符: ! & | not and or位运算符: & | 移位运算符: 赋值运算符: = += -= *= /= %= = |= &= =条件运算符: ?:63第二章 C+语法2.5 C+运算符2.5.1
23、 常用运算符常用运算符求字节运算符:sizeof指针运算符:* &成员选择运算符: - .* -*下标运算符: 函数运算符:( )域选择运算符::逗号运算符:,其它运算符 64第二章 C+语法2.5 C+运算符2.5.2 动态内存分配和释放动态内存分配和释放动态存储分配和释放存储空间的功能,动态存储分配和释放存储空间的功能,C语言是利用语言是利用malloc和和free函数完成的。函数完成的。函数原型为:函数原型为: void * malloc(size_t size); void free(void * p);65C+提供了新的运算符new和delete来完成动态存储分配和释放存储空
24、间的工作:new的参数是待分配单元的数目,它自动计算要分配类型的大小,而不给出要分配的存储区的大小(字节数) ;new自动返回正确的指针类型,不必对返回指针进行类型转换;可以用new将分配的存储空间进行初始化; 运算符运算符new用于内存分配的使用形式为用于内存分配的使用形式为 type * p; p=new type; 其中,其中,type是一个数据类型名;是一个数据类型名; p是指向该数据类型的指针;是指向该数据类型的指针; new从堆的一块空闲内存区中分配一块内存从堆的一块空闲内存区中分配一块内存 其大小就是其大小就是type类型的数据长度,该内存地址被存类型的数据长度,该内存地址被存于
25、指针于指针p中。中。 如果分配失败,如果分配失败,new new 返回一个空指针。返回一个空指针。 typetype可以是任何类型,包括函数指针,但不可以是任何类型,包括函数指针,但不允许函数类型。允许函数类型。 当当typetype为数组类型时,为数组类型时,newnew返回的指针指向数返回的指针指向数组的第一个元素,当用组的第一个元素,当用newnew创建多维数组时,创建多维数组时,必须提供所有维的大小。必须提供所有维的大小。 注意:注意: 使用使用newnew申请的存储空间是没有名字的,只申请的存储空间是没有名字的,只能通过指针间接访问它们。能通过指针间接访问它们。 运算符运算符dele
26、te释放释放new分配的存储空间,将分配的存储空间,将其交还给堆。它的使用形式一般为其交还给堆。它的使用形式一般为 delete p; 其中,其中,p必须是一个指针,保存着必须是一个指针,保存着new分配的分配的内存的首地址。内存的首地址。 动态分配管理的方法要求动态分配管理的方法要求deletedelete的操作数必的操作数必须是一个须是一个newnew返回的指针,对不是由返回的指针,对不是由newnew得到得到的任何其他地址类型,使用的任何其他地址类型,使用deletedelete将导致严将导致严重错误。重错误。 这种错误是运行时的错误,很难调试,因此这种错误是运行时的错误,很难调试,因此
27、使用使用deletedelete时请务必注意。时请务必注意。 回收回收newnew分配的数组空间,使用分配的数组空间,使用deletedelete进行进行 delete p; delete p; 表明一个由表明一个由 p p 指向的数组空间被回收了。指向的数组空间被回收了。 new和delete典型用法1 动态分配和释放单个数据的存储区语法为: type * p; p=new type; /通过*p方式访问new申请的空间。 delete p; int main( ) int * p; p=new int; if (!p) cout“allocation failuren”;return 1;
28、 *p=20; delete p; return 0;2 用new运算符初始化单个数据的存储区 语法为: type * p; p=new type(); delete p; 3 动态分配数组的存储空间(1)一维数组 语法为: type * p; p=new types; /通过pi的方式访问数组元素。 delete p; (2)n维数组 语法为: type (* p)常量1常量2常量n-1; p=new types常量1常量2常量n-1; /通过pi1i2in的方式访问数组元素。delete p; s指定数组中的第一维元素个数,可以是常量或表达式。 不能省略 。第二章 C+语法2.5 C+运算
29、符2.5.3 类型转换运算符类型转换运算符1. 隐式转换隐式转换发生在下述的情况下:混合运算:级别低的类型向级别高的类型转换。将表达式的值赋给变量:表达式的值向变量类型的值转换。实参向函数形参传值:实参的值向形参的值进行转换。函数返回值:返回的值向函数返回类型的值进行转换。79第二章 C+语法2.5 C+运算符2.5.3 类型转换运算符类型转换运算符2. 显式类型转换显式类型转换有几种风格:C风格: (TYPE)表达式 (TYPE)(表达式)C+风格: TYPE(表达式)80第二章 C+语法2.5 C+运算符2.5.3 类型转换运算符类型转换运算符2. 显式类型转换使用类型安全的显式类型转换运
30、算符 float fnum = 5.8;const int icnum = 10;int inum = static_cast(fnum); int inum2 = const_cast(icnum);81第二章 C+语法2.6 表达式2.6.1 C+表达式表达式C+的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式 := 变量名 | 常量名 | 字面常量表达式 := ( 表达式 )表达式 := 表达式 运算符 表达式82第二章 C+语法2.6 表达式2.6.1 C+表达式表达式C+的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式 := 变量名 | 常量名 |
31、 字面常量表达式 := ( 表达式 )表达式 := 表达式 运算符 表达式83第二章 C+语法2.7 C+语句2.7.1 简单语句和复合语句简单语句和复合语句在任何合法的C+表达式后面加上一个分号“;”就能使其构成一条合法的C+语句。甚至一个单独的分号也能成为语句,这叫空语句。 任何C+声明都是语句。 多条语句可以复合在一起完成一定的功能。这些语句构成了复合语句。复合语句必须放在一对花括号 之间。 84第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句1. if-else语句 if (bool表达式)语句1 else语句2(ex2-11.cpp)85第二章 C+语法2.7 C
32、+语句2.7.2 流程控制语句流程控制语句2. switch-case语句switch (整型表达式)case 常量表达式1: 语句1; break;case 常量表达式2: 语句2; break;default:语句n;(ex2-12.cpp)86第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句3. while语句while (bool表达式)语句(ex2-13.cpp)87第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句4. do-while语句do 语句 while (bool表达式);(ex2-14.cpp)88第二章 C+语法2.7 C+语句2
33、.7.2 流程控制语句流程控制语句5. for语句for (表达式1; 表达式2; 表达式3)语句(ex2-15.cpp)89第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句6. break和continue语句在循环控制语句当中,如果我们根据某个条件需要提前结束整个循环,我们可以利用break语句。不过,break语句只能终止包含它的那层循环语句。如果这层循环包含在另一个外层循环之内,那么break就鞭长莫及了。 忽略此后的包含在循环体中的语句而直接进入下一次的循环可以使用continue语句。(ex2-16.17.cpp) 90第二章 C+语法2.7 C+语句2.7.2
34、 流程控制语句流程控制语句7. goto语句很多的专家都认为应该取消goto语句,不过C+还是保留了它。现在goto语句的最大作用就是从嵌套很深的循环中直接跳出来。在其它的场合尽量少使用goto语句。其实goto语句也可以构成循环,不过在高级语言程序中我们都不这么做,除非有特别的理由。91第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句8. return语句return语句会引起函数立刻返回(结束),main函数也不例外。return语句的格式为:return 表达式;92第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句9. try-catch语句try
35、-catch语句用于保护容易发生错误的语句块,并且能在错误发生时捕获错误,然后对错误进行处理。它的语法如下:Try 语句*; catch (类型1 变量名1) 语句; catch (类型2 变量名2) 语句; catch (类型n 变量名3) 语句; 93第二章 C+语法2.8 函数2.8.1 函数原型声明和定义函数原型声明和定义函数原型是一个很重要的概念,函数原型担负着三个特殊的任务: 确定函数返回值的类型,使编译程序能产生函数返回数据类型的正确代码。 确定了函数使用的参数的类型、个数和顺序。 函数名代表该函数的函数体以及函数完成的功能。函数原型一般的语法形式为 返回类型 函数名(参数列表)
36、94第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数C+采用“传值”或“传地址”的方式来使实际参数和形式参数相结合。1. 传值调用(Call by value) 实参和形参是两个不同的单元,在结合时,实参的值将会被拷贝到形参中。95第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数2、传地址 引用做参数。形参是实参的别名。 也就是说,形参就是实参本身。这样一来,对形参的改变也就直接改变了实参。96第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数用const修饰参数 使用指针和引用参数,实参存在被更改的潜在“危险”。 为了避免这种危险,可以给形参加上const约
37、束,这是形参/实参成为只读参数,从而避免了被更改的问题。 97第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数缺省参数缺省参数是另一种形式的重载(函数调用的重载)void fun(int num = 0) (ex2-21.cpp)其中:num称为缺省参数,0称为缺省值。可以用两种方式调用函数 fun:fun(10); / 传递显式的值,则num的初始值为10fun(); / 无对应的实参,则num的初始值为0 98第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值 函数是一个完成一定功能的程序块,在很多时候需要将计算的结果传递给调用该函数的程序块。 传递结果的方式之一
38、就是让函数返回一个值。 实际上是将返回的值放到一个结果寄存器或临时单元中。99第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值1. 函数返回值函数返回的值类型,int strlen(const char *str) char *p = str; While (*p) p+; return p str;100第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值2. 函数返回指针函数返回指针,实际上也是返回一个值,不过这个值是某个单元的地址。101char * strcat(const char *str1, const char *str2)char * str=ne
39、w char strlen(str1)+strlen(str2)+1;char * p = str;while (*p+ = *str1+); p-; while (*p+ = *str2+); return str;第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值3.函数返回引用 函数返回引用,实际上返回的是一个存储单元(即变量)。103第二章 C+语法2.8 函数2.8.4 内联函数内联函数许多C程序员使用带有参数的宏调用来完成简单函数的调用,但宏很受限,每个变元仅能被引用一次,有时会产生不可期望的副作用。例如:#define abs(v) (v) 0 ? -(v): (v
40、) 当调用为 abs(+a) 时,将不能正确工作!因为在程序中每次遇到宏替换名时,就用所定义的字符串去替换它,那么替换的结果将是(+a) 0 ? -(+a) : (+a)得到的是a + 2的绝对值,这产生不期望的结果。 104第二章 C+语法2.8 函数2.8.4 内联函数内联函数宏替换的好处是没有系统的调用开销。函数正相反。为结合两者的优点,C+语言允许定义内联函数。在函数原型前冠以“inline”表示一个内联函数。例如:inline void function(int a, int b);编译时,在调用 function的地方用函数体替换,能够加快代码执行,减少调用开销。 105第二章 C
41、+语法2.8 函数2.8.5 函数递归函数递归 函数递归调用是一个函数直接或者间接调用自己。 递归是非常有用的一种调用方式,因为它可以减少代码量。 不过,递归代码一般不容易理解,并且执行时对资源(主要的栈资源)消耗较大。(ex2-23.cpp) 106第二章 C+语法2.8 函数2.8.6 函数重载函数重载由于所有C+函数都有函数原型,因此C+容易表达重载(overload)一个函数名的概念。亦即它能区分多个函数,即使它们具有相同的名字但有不同的参数。C+允许进行函数重载:多个函数具有相同的函数名,但有不同的参数表和各自的函数体。只要编译能区分参数表(参数个数和类型),就可以重载一个函数名。1
42、07第二章 C+语法2.8 函数2.8.6 函数重载函数重载double abs(double num) return (num 0 ) ? -num : num);long abs(long num) return (num 0) ? -num : num); 多个同名函数的原型中不允许只有返回类型不相同,而函数名和参数表完全相同的情况。 108第二章 C+语法2.8 函数2.8.7 变量的存储方式变量的存储方式1. 全局变量:extern关键字2. 局部变量 autoregisterStatic(ex2-24.25.cpp)109第二章 C+语法2.8 函数2.8.8 标识符的作用范围标识
43、符的作用范围 110int nGlobal1;void func1(int x)/func1int nVar1;/func1int nGlobal2;void func2()/func2static int Var2; /block 1int nVar3;/block 2int nVar4;/block 2/block 1/func2nGlobal1xnVar1nGlobal2nVar3nVar4func1func2nVar2第二章 C+语法2.9 异常处理机制2.9.1 异常处理的意义异常处理的意义异常处理是C+语言的一个主要特征,它提出了出错处理更加完美的方法。 出错处理程序的编写不再繁琐,也不须将出错处理程序与“通常”代码紧密结合。111第二章 C+语法2.9 异常处理机制2.9.1 异常处理的意义异常处理的意义 错误发生是不会被忽略的。 如果被调用函数需发送一条出错信息给调用函数,它可向调用函数发送描述出错信息的对象。如果调用函数没有捕捉和处理该错误信号,在后续时刻该调用函数将继续发送描述该出错信息的对象,直到该出错信息被捕捉和处理。 112第二章 C+语法2.9 异常处理机制2.9.2 异常处理的方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绩效考核方案激发员工积极性的有效工具
- 养老护理员安宁疗护知识培训总结
- 深入解读公司人事管理的全方位工作流程
- 砂轮机操作安全培训教材集
- 数控车工中级面试实战模拟
- 大气辐射考试题库及答案
- 消防设施工程项目施工进度控制方案
- 土石方工程地下水处理与排水方案
- 高层建筑照明安全管理方案
- 个人贷款业务合规经营手册
- IICL测试考核资料
- 银行保安服务 投标方案(技术标)
- QCT848-2023拉臂式自装卸装置
- AI智能视频分析平台2021
- 精神科常见病小讲课
- 大学生生涯发展展示
- 初中音乐八年级下册(简谱) 菊花台 公开课比赛一等奖
- 潜水作业安全教育课件
- 《家庭社会工作》课件
- 分布式光伏高处作业专项施工方案
- 岩体原位测试(岩土测试技术)
评论
0/150
提交评论