《面向对象程序设计语言.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计语言.ppt(101页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象程序设计语言面向对象程序设计语言C+C+电子科技大学示范性软件学院电子科技大学示范性软件学院1第二章 C+语法 C+程序概貌第一个C+程序()#include /包含ANSI C+头文件using namespace std;/使用预定义的名字空间stdvoid main(void)cout “Hello,world!”endl;/在屏幕上输出字符串2第二章 C+语法 C+程序概貌 ISO/ANSI C+头文件头文件程序的第一行是#include。#include是一条编译预处理指令,它的作用是在源文件中插入iostream文件所包含的所有源代码。我们将iostream文件称为头文件。
2、与C的头文件不同,ISO/ANSI C+头文件没有.h后缀。3第二章 C+语法 C+程序概貌 名字空间名字空间包含头文件iostream的目的是为了使用标准输出流cout。但如果仅仅是在原代码中包含了iostream,程序还是不能正确地通过编译,因为编译器不认识cout和endl这两个标识符。所以,我们通过using namespace std语句来引入名为std的名字空间。4第二章 C+语法 C+程序概貌 名字空间名字空间可以自定义名字空间,语法如下:namespace std/std是一个名字空间的名字/这里声明了常量、变量、数据类型等等5第二章 C+语法 C+程序概貌 名字空间名字空间一
3、旦一个标识符,例如ken,被定义在一个名字空间里,那么它就被隐藏在了那个名字空间里,也就是说,ken只能被包含在那个名字空间里的语句直接访问。试图在名字空间之外访问ken会得到一个编译器找不到标识符的错误。6第二章 C+语法 C+程序概貌 名字空间名字空间解决问题的方案有两个:1.使用名字限定符std:cout “Hello,world!”和“”实现,需要包含库文件iostream。()10第二章 C+语法 C+程序概貌 注释注释C+具有C的多行风格注解。使用“/*”开始,直到“*/”结束,可以注解多行,但不允许嵌套。C+也 提 供 一 种 新 的 表 示 注 解 的 方 法,Comment_
4、to_end_of_line的结构,使用“/”开始,直到行尾结束。为程序加入适当的注释是非常有价值的,因为这些注释可以为我们阅读程序提供帮助。实际上,适当的注释是高质量源代码的一部分注解。11第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型1.整型C+整数类型包括字符型char、短整型short、整型int和长整型long。它们之所以被称为整数类型是因为它们的值都是数学意义上的整数,没有小数部分。下面的这些数都属于整数类型:-128,-30,0,64,65535,47109523812第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型1.整型我们可以用
5、到的整数类型有8种:char,short,int,long,unsigned char,unsigned short,unsigned int,unsigned long其中,unsigned int可以简写为unsigned。13第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型2.字符型字符型char是一种特别的整数类型,因为在大多数情况下,我们不用它来表示整数,而是使用它的本意:表示字符。下面的例子都是字符:Az5+字符型数据在内存中是以ASCII码的形式存储的。由于字符的存储值ASCII码是个整数,因此在某些情况下我们会把字符数据当作整型数据来参与运算,或者表示比s
6、hort更短的整数。14第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型2.字符型C+采用了转意字符序列。比如,n并不代表字符n,而是表示新行(new line)。这里符号(反斜杆)叫做转意字符,意思是跟在它后面的字符不再是原来的含义,而是具有其它的含义。如果当要用到符号本身,我们需要把它写成。15第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型3.布尔型布尔型bool是一种特殊的内建整数类型,因为它采用与整数相同的存储方式。不过,布尔类型的表达范围非常有限,只能取false和true两个值。这是两个C+的关键字,而且是两个字面常量标识符,并不是字符
7、串。16第二章 C+语法 C+的内建(Built-in)类型 整数类型整数类型3.布尔型应该注意的是,虽然这里把bool类型归为整数类型,但这并不等于我们可以把它当作整数使用。bool类型主要用来表达一种逻辑真或假的状态,在这一点上,它的含义和用途与整数是完全不同的。17第二章 C+语法 C+的内建(Built-in)类型 浮点类型浮点类型浮点数指的是带有小数部分的数,用来表示数学意义上的实数。实数的表示是:整数部分+小数点+小数部分其中小数部分看起来也是个整数。除了小数点,整数部分和小数部分可以缺省,但不能两者都缺。下面是一些浮点数的例子:,6.,.218第二章 C+语法 C+的内建(Bui
8、lt-in)类型 浮点类型浮点类型C+的浮点类型有三种:float、double、long double。由于所有的计算机都是用二进制的方式来存储数据的,因此这影响了浮点数的表示精度,浮点数的存储值和实际值是有很微小的差别的。在大多数情况,这个差别不会对应用造成影响,但是在某些情况下我们不能忽略累积的误差。19第二章 C+语法 变量和命名常量 标识符标识符为了使C+程序更加易读易写,我们会用一些有意义的名字来标识程序元素,比如数据、函数等等。那些用来标识程序元素的名字就是标识符。使用自定义标识符也是所有高级语言的特征。标识符是由字母A-Z,a-z和数字0-9混合而成的,另外可以加入下划线_。不
9、过,所有的标识符必须以字母或者是下划线_开头。20第二章 C+语法 变量和命名常量 标识符标识符我们在命名一个标识符的时候,最好遵循一些常用的约定:1.取一个有意义的名字。2.如果名字由多个单词组成,那么每个单词的第一个字母用大写。注意,C+是大小写敏感的语言。3.使用匈牙利记号。匈牙利记号是一种前缀,其做法是在标识符的前面加上一个小写字母以示其数据类型。21第二章 C+语法 变量和命名常量 变量声明变量声明下面是变量声明的例子:charcData;boolbFlag;intiPage,nCount;doublefDelta;22第二章 C+语法 变量和命名常量 变量声明变量声明一旦声明了一个
10、变量,这个变量在运行时就会在内存中占据一定大小的空间。例如声明变量iPage在内存中的映像如下图所示:23iPage0 x0013FF78内存单元的符号名内存单元的32位地址内存单元的大小在32位机上是4字节第二章 C+语法 变量和命名常量 常量(常量(Named Constant)和)和const关键字关键字1.字面常量下面是一些字面常量和所属类型的例子:10(int)077L(long)0 xABCDu(unsigned int)9.78f(float)7905.30(double)A(char)xE7(char)“Hello”(string)24第二章 C+语法 变量和命名常量 常量(常
11、量(Named Constant)和)和const关键字关键字2.命名常量使用字面常量省掉了占用内存单元的开销,但也有一些缺点:当我们在多处使用了相同的字面常量,而后来又要对这个常量进行修改时就会显得非常麻烦;字面常量没有明确的类型信息,它们的类型采用编译器的约定。25第二章 C+语法 变量和命名常量 常量(常量(Named Constant)和)和const关键字关键字2.命名常量为了解决上述的问题,可以使用C风格的没有参数的宏定义:这里的PI并不是真正的符号常量,它仅仅是一个字符串,没有类型,不占用存储空间,不能取它的地址,只是在预处理时,凡是出现PI的地方都将会被替换为。26第二章 C+
12、语法 变量和命名常量 常量(常量(Named Constant)和)和const关键字关键字2.命名常量C+提供一个更灵活的命名常量(Named Constant)方式来描述常数:const float PI=3.14;const关键字的作用就是“冻结”一个单元。这样,PI成为一个真正的符号常量,有类型,需要占用存储空间(存放在常量数据区),但它的值不能被修改。27第二章 C+语法 变量和命名常量 易变变量和易变变量和volatile关键字关键字1.我们在程序中使用变量,但在某些特定的应用当中的一些变量,它们太容易被改变了。这很容易造成程序在某一时刻用到的该变量的值并不是它此刻真正的值。2.C
13、+引入了“易变变量(Volatile Variable)”的概念。C+使用volatile关键字来约束一个变量,以警告编译器这是一个易变变量:3.volatile int nSharedData;28第二章 C+语法 用户自定义类型29C+的数据类型地址类型简单类型结构类型整数类型布尔型 bool字符型 unsigned char短整型 unsigned short整型 unsigned int长整型 unsigned long浮点类型单精度浮点型 float双精度浮点型 double长双精度浮点型long double枚举类型 enum指针类型 pointer引用类型 reference数组
14、 array结构 struct联合 union类 class第二章 C+语法 用户自定义类型1.2.4.1 枚举枚举用宏来定义一系列表示状态的常量有明显的缺陷,就是没有类型信息。C+提供了一种更好的解决方案,就是使用枚举类型:enum TrafficLight RED,GREEN,AMBER;标识符RED、GREEN、AMBER被称为枚举常量,它们不是字符串,也不是整型常量。另外,枚举常量是有序的,也就是说,有大小的,上面例子中的顺序是这样的:RED GREEN nID=20070101;49第二章 C+语法 用户自定义类型2.4.4 指针指针3.指针和常量修饰符constconst也可以与指
15、针一起使用,它们的组合情况复杂一些,可归结为三种:指向常量的指针、常指针和指向常量的常指针。const char*pc;/指向常量的指针,pc指向的单元不能改变,但pc可以改变char*const cp;/常指针,cp不能改变,但它指向的单元可以改变const char*const cpc;/指向常量的常指针,两者都不能变50第二章 C+语法 用户自定义类型2.4.5 引用引用简单地说,引用就是给一个变量取一个别名。也就是说,引用与它所引用的变量实际上是同一个单元。这样,一个变量就拥有两个名字。int iPage;int&riPage=iPage;/iPage、riPage都是同一个单元的名字
16、51iPage(riPage)0 x00208730变量及其引用变量及其引用第二章 C+语法 用户自定义类型2.4.5 引用引用下面两条语句是等价的,它们的作用都是给iPage变量赋值为9。iPage=9;riPage=9;52第二章 C+语法 用户自定义类型2.4.5 引用引用一旦引用变量被绑定在一个普通变量上,那么这种绑定关系就是永久的。int iPage2=99;riPage=iPage2;上面第二条语句不是试图改变riPage的绑定关系,而是给它赋值,也就是直接给iPage赋值。(ex2-3.cpp)由于一个引用变量必须引用指向某一变量,因此独立引用必须在它被说明时加以初始化。53第二
17、章 C+语法 用户自定义类型2.4.6 用用typedef定义类型的别名定义类型的别名对于一些复杂的类型,在它们的定义中有较多的限定符或修饰符,这可能会让读者感到迷惑。为了简化的目的,我们可以用C+的typedef语句为那些类型提供一个简单的别名。例如:typedef intINT;typedef double(*DBLARRPTR)10;/定义一个指针类型,该类型的指针指向一个长度为10的double型数组 54第二章 C+语法2.5 C+运算符2.5.1 常用运算符常用运算符算数运算符:+-*/%+-关系运算符:=!=(not_eq)逻辑运算符:!&|not and or位运算符:(com
18、pl)&(bitand)|(bitor)(xor)移位运算符:赋值运算符:=+=-=*=/=%=|=(or_eq)&=(and_eq)=(xor_eq)条件运算符:?:55第二章 C+语法2.5 C+运算符2.5.1 常用运算符常用运算符求字节运算符:sizeof指针运算符:*&成员选择运算符:.-.*-*下标运算符:函数运算符:()域选择运算符::逗号运算符:,其它运算符 56第二章 C+语法2.5 C+运算符2.5.2 动态内存分配和释放运算符:动态内存分配和释放运算符:new和和deleteC+提供了新的运算符new和delete来完成动态存储分配和释放存储空间的工作:new的参数是待分
19、配单元的数目,它自动计算要分配类型的大小,而不给出要分配的存储区的大小(字节数);new自动返回正确的指针类型,不必对返回指针进行类型转换;可以用new将分配的存储空间进行初始化;delete会将释放后的指针置为NULL。57第二章 C+语法2.5 C+运算符2.5.2 动态内存分配和释放运算符:动态内存分配和释放运算符:new和和deletedouble*p;p=new double;delete p;p=new double10;delete p;(ex2-8.10.cpp)580 x00481BF00 x00481BF00 x0013FF44用用new运算符分配内存运算符分配内存p堆堆(
20、Heap)进程占据的内存进程占据的内存第二章 C+语法2.5 C+运算符2.5.3 类型转换运算符类型转换运算符1.隐式转换隐式转换发生在下述的情况下:混合运算:级别低的类型向级别高的类型转换。(注:某个类型的一个数据占用的存储空间越多,则该类型的级别越高)。将表达式的值赋给变量:表达式的值向变量类型的值转换。函数实参向函数形参传值:实参的值向形参的值进行转换。函数返回结果:返回的值向函数返回类型的值进行转换。59第二章 C+语法2.5 C+运算符2.5.3 类型转换运算符类型转换运算符2.显式类型转换显式类型转换有几种风格:C风格:(int)aC+风格:int(a)60第二章 C+语法2.5
21、 C+运算符2.5.3 类型转换运算符类型转换运算符2.显式类型转换使用类型安全的显式类型转换运算符 float fnum=5.8;const int icnum=10;int inum=static_cast(fnum);int inum2=const_cast(icnum);61第二章 C+语法2.6 表达式2.6.1 C+表达式表达式C+的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式:=变量名|常量名|字面常量表达式:=(表达式)表达式:=表达式 运算符 表达式62第二章 C+语法2.6 表达式2.6.1 C+表达式表达式C+的表达式是一种能计算出一个值的语法分量,它
22、的形式化定义如下:表达式:=变量名|常量名|字面常量表达式:=(表达式)表达式:=表达式 运算符 表达式63第二章 C+语法2.7 C+语句2.7.1 简单语句和复合语句简单语句和复合语句在任何合法的C+表达式后面加上一个分号“;”就能使其构成一条合法的C+语句。甚至一个单独的分号也能成为语句,这叫空语句。任何C+声明都是语句。多条语句可以复合在一起完成一定的功能。这些语句构成了复合语句。复合语句必须放在一对花括号 之间。64第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句1.if-else语句 if(bool表达式)语句1 else语句2(ex2-11.cpp)65第二章
23、 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句2.switch-case语句switch(整型表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;default:语句n;(ex2-12.cpp)66第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句3.while语句1.while(bool表达式)2.语句3.(ex2-13.cpp)67第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句4.do-while语句do 语句 while(bool表达式);(ex2-14.cpp)68第二章 C+语法2.7
24、 C+语句2.7.2 流程控制语句流程控制语句5.for语句for(表达式1;表达式2;表达式3)语句(ex2-15.cpp)69第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句6.break和continue语句在循环控制语句当中,如果我们根据某个条件需要提前结束整个循环,我们可以利用break语句。不过,break语句只能终止包含它的那层循环语句。如果这层循环包含在另一个外层循环之内,那么break就鞭长莫及了。忽略此后的包含在循环体中的语句而直接进入下一次的循环可以使用continue语句。(ex2-16.17.cpp)70第二章 C+语法2.7 C+语句2.7.2
25、流程控制语句流程控制语句7.goto语句很多的专家都认为应该取消goto语句,不过C+还是保留了它。现在goto语句的最大作用就是从嵌套很深的循环中直接跳出来。在其它的场合尽量少使用goto语句。其实goto语句也可以构成循环,不过在高级语言程序中我们都不这么做,除非有特别的理由。71第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句8.return语句return语句会引起函数立刻返回(结束),main函数也不例外。return语句的格式为:return 表达式;72第二章 C+语法2.7 C+语句2.7.2 流程控制语句流程控制语句9.try-catch语句try-cat
26、ch语句用于保护容易发生错误的语句块,并且能在错误发生时捕获错误,然后对错误进行处理。它的语法如下:Try 语句*;catch(类型1 变量名1)语句;catch(类型2 变量名2)语句;catch(类型n 变量名3)语句;73第二章 C+语法2.8 函数2.8.1 函数原型声明和定义函数原型声明和定义函数原型是一个很重要的概念,函数原型担负着三个特殊的任务:确定函数返回值的类型,使编译程序能产生函数返回数据类型的正确代码。确定了函数使用的参数的类型、个数和顺序。函数名代表该函数的函数体以及函数完成的功能。函数原型一般的语法形式为返回类型 函数名(参数列表);74第二章 C+语法2.8 函数2
27、.8.2 函数的参数函数的参数1.传值调用(Call by value)2.C+采用“传值Call by value”的方式来使实际参数和形式参数相结合的。在这种情况下,实参和形参是两个不同的单元,在结合时,实参的值将会被拷贝到形参中。拷贝的过程是非常“原始”的位拷贝方式。75第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数1.传值调用(Call by value)传值调用int i=0;void f(int x);f(i);(ex2-18.cpp)760 0i iMemoryMemory0 0StackStackCopyCopyx x第二章 C+语法2.8 函数2.8.2 函数的
28、参数函数的参数2.传指针调用int i=0;int*pi=&i;void f(int*p);f(pi);(例:ex2-19.cpp)770 0&i&ipipiMemoryMemory&i&ip pStackStackCopyCopyi i第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数3.传值引用1.比传递指针更好的方式是传递引用。在这种情况下,形参的名字将被看作是实参的别名(同独立引用的情况一样),也就是说,形参就是实参本身。这样一来,对形参的改变也就直接改变了实参。78第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数3.传值引用int i=0;void f(int&
29、x);f(i);(例:ex2-20.cpp)790 0i(x)i(x)MemoryMemoryStackStack第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数4.用const修饰参数使用指针和引用参数具有实参被更改的潜在“危险”。为了避免这种危险,可以给形参加上const约束,这是形参/实参成为只读参数,从而避免了被更改的问题。80第二章 C+语法2.8 函数2.8.2 函数的参数函数的参数5.缺省参数C+有缺省参数的概念,它是另外一种形式的重载(称为函数调用的重载)。void fun(int num=0)(ex2-21.cpp)其中:num称为缺省参数,0称为缺省值。可以用两
30、种方式调用函数 fun:fun(10);/传递显式的值,则num的初始值为10fun();/无对应的实参,则num的初始值为0 81第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值函数是一个完成一定功能的程序块,在很多时候需要将计算的结果传递给调用该函数的程序块。传递结果的方式之一就是让函数返回一个值。我们先来看看函数原型的声明:返回类型 函数名(参数列表);这里的返回类型就是函数返回值的类型,它可以使任意的合法类型。82第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值1.函数返回值类型函数返回一个值类型,实际上是将返回的值放到一个临时单元中。调用者可以拷贝临时
31、单元的值以供以后使用。int strlen(const char*str)char*p=str;While(*p)p+;return p str;83第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值2.函数返回指针函数返回指针,实际上也是返回一个值,不过这个值是某个单元的地址。char*strcat(const char*str1,const char*str2)char*str=new char strlen(str1)+strlen(str2)+1;char*p=str;while(*p+=*str1+);/copy every character into str,/in
32、cluding ending NULLp-;while(*p+=*str2+);return str;84第二章 C+语法2.8 函数2.8.3 函数的返回值函数的返回值3.函数返回引用函数返回引用,实际上返回的是一个存储单元(即变量),因此,如果一个函数返回引用的话,则函数调用可以出现在赋值号的右边(作为表达式的一部分,因为变量的值可以被使用),也可以出现在赋值号的左边(因为变量的值也可以被修改)。(ex2-22.cpp)85第二章 C+语法2.8 函数2.8.4 内联函数内联函数许多C程序员使用带有参数的宏调用来完成简单函数的调用,但宏很受限,每个变元仅能被引用一次,有时会产生不可期望的副
33、作用。例如:#define abs(v)(v)0?-(v):(v)当调用为 abs(+a)时,将不能正确工作!因为在程序中每次遇到宏替换名时,就用所定义的字符串去替换它,那么替换的结果将是(+a)0?-(+a):(+a)得到的是a+2的绝对值,这产生不期望的结果。86第二章 C+语法2.8 函数2.8.4 内联函数内联函数宏替换的好处是没有系统的调用开销。函数正相反。为结合两者的优点,C+语言允许定义内联函数。在函数原型前冠以“inline”表示一个内联函数。例如:inline void function(int a,int b);编译时,在调用 function的地方用函数体替换,能够加快代
34、码执行,减少调用开销。87第二章 C+语法2.8 函数2.8.5 函数递归函数递归函数递归值得是一个函数直接或者间接调用自己的现象。在有的时候,递归是非常有用的一种调用方式,因为它可以减少代码量。不过,递归代码一般不容易理解,并且执行时对资源(主要的栈资源)消耗较大。(ex2-23.cpp)88第二章 C+语法2.8 函数2.8.6 函数重载函数重载由于所有C+函数都有函数原型,因此C+容易表达重载(overload)一个函数名的概念。亦即它能区分多个函数,即使它们具有相同的名字但有不同的参数。C+允许进行函数重载:多个函数具有相同的函数名,但有不同的参数表和各自的函数体。只要编译能区分参数表
35、(参数个数和类型),就可以重载一个函数名。89第二章 C+语法2.8 函数2.8.6 函数重载函数重载double abs(double num)return(num 0)?-num:num);long abs(long num)return(num 0)?-num:num);多个同名函数的原型中不允许只有返回类型不相同,而函数名和参数表完全相同的情况。90第二章 C+语法2.8 函数2.8.6 函数重载函数重载double abs(double num)return(num 0)?-num:num);long abs(long num)return(num 0)?-num:num);多个同名
36、函数的原型中不允许只有返回类型不相同,而函数名和参数表完全相同的情况。91第二章 C+语法2.8 函数2.8.7 变量的存储方式变量的存储方式1.全局变量:extern关键字2.局部变量 1.auto2.register3.Static4.(ex2-24.25.cpp)92第二章 C+语法2.8 函数2.8.8 标识符的作用范围标识符的作用范围 93int nGlobal1;void func1(int x)/func1int nVar1;/func1int nGlobal2;void func2()/func2static int Var2;/block 1int nVar3;/block
37、2int nVar4;/block 2/block 1/func2nGlobal1xnVar1nGlobal2nVar3nVar4func1func2nVar2第二章 C+语法2.9 异常处理机制2.9.1 异常处理的意义异常处理的意义异常处理是C+语言的一个主要特征,它提出了出错处理更加完美的方法。出错处理程序的编写不再繁琐,也不须将出错处理程序与“通常”代码紧密结合。在错误有可能出现处写一些代码,并在后面的单独节中加入出错处理程序。如果程序中多次调用一个函数,在程序中加入一个函数出错处理程序即可。94第二章 C+语法2.9 异常处理机制2.9.1 异常处理的意义异常处理的意义错误发生是不会
38、被忽略的。如果被调用函数需发送一条出错信息给调用函数,它可向调用函数发送描述出错信息的对象。如果调用函数没有捕捉和处理该错误信号,在后续时刻该调用函数将继续发送描述该出错信息的对象,直到该出错信息被捕捉和处理。95第二章 C+语法2.9 异常处理机制2.9.1 异常处理的意义异常处理的意义使用异常便于:使问题固定下来和重新调用这个(导致异常的)函数。把事情修补好而继续运行,不去重试函数。计算一些选择结果用于代替函数假定产生的结果。在当前上下文环境尽其所能并且再把同样的异常弹向更高的上下文中。在当前上下文环境尽其所能并且把一个不同的异常弹向更高的上下文中。终止程序。包装使用普通错误方案的函数(尤
39、其是C的库函数),以便产生异常替代。简化,假若我们的异常方案建造得过于复杂,使用时会令人懊恼。使我们的库和程序更安全。这是短期投资(为了调试)和长期投资(为了应用的健壮性)问题。96第二章 C+语法2.9 异常处理机制2.9.2 异常处理的方法异常处理的方法1.抛出异常2.throw 表达式;2.异常捕获try语句*;catch(类型1 变量名1)语句;catch(类型2 变量名2)语句;catch(类型n 变量名3)语句;(ex2-26.cpp)97第二章 C+语法2.9 异常处理机制2.9.2 异常处理的方法异常处理的方法2.异常捕获try块关键字try引导可能出错的语句块。98第二章 C
40、+语法2.9 异常处理机制2.9.2 异常处理的方法异常处理的方法2.异常捕获异常处理器 异常处理器紧随try块之后,处理的方法由关键字catch引导。如果一个异常信号被抛出,异常处理器中第一个参数与异常抛出对象相匹配的函数将捕获该异常信号,然后进入相应的catch子句,执行异常处理程序。99第二章 C+语法2.9 异常处理机制2.9.2 异常处理的方法异常处理的方法2.异常捕获异常类型exception:最基本的异常类,是其它所有标准异常类的基类logic_error:逻辑错误异常类,是exception的子类domian_error:域错错误异常类,是logic_error的子类inval
41、id_argument:参数错误异常类,是logic_error的子类length_error:长度错误异常类,是logic_error的子类out_of_range:范围错误异常类,是logic_error的子类bad_cast:转换错误异常类,是logic_error的子类bad_typeid:类型信息错误异常类,是logic_error的子类runtime_error:运行时错误异常类,是exception的子类range_error:范围错误异常类,是runtime_error的子类overflow_error:溢出错误异常类,是runtime_error的子类bad_alloc:内存分配错误异常类,是runtime_error的子类100第二章 C+语法2.9 异常处理机制2.9.2 异常处理的方法异常处理的方法2.异常捕获异常规格说明 异常规格说明再次使用了关键字throw,函数的所有潜在异常类型均随着关键字throw而插入函数说明中。所以函数说明可以带有异常说明如下:void f()throw(toobig,toosmall,divzero);101
限制150内