《中国高等院校计算机基础教育课程体系规划教材讲授第14章》由会员分享,可在线阅读,更多相关《中国高等院校计算机基础教育课程体系规划教材讲授第14章(62页珍藏版)》请在金锄头文库上搜索。
1、漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章第第14章章 C+工具工具14.1 异常处理异常处理14.2 命名空间命名空间14.3 使用早期的函数库使用早期的函数库曲谎页宏嗜茬慎怎蛤材穴阑签卓慑饥站徊晾雕崖宴侍案察凛评啃泞贞各碟中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等
2、院校计算机基础教育课程体系规划教材讲授-第14章在在C+发展的后期,有时发展的后期,有时C+编译系统根据实际工作编译系统根据实际工作的需要,增加了一些功能,作为工具来使用,其中主的需要,增加了一些功能,作为工具来使用,其中主要有模板要有模板(包括函数模板和类模板包括函数模板和类模板)、异常处理、命名、异常处理、命名空间和运行时类型识别,以帮助程序设计人员更方便空间和运行时类型识别,以帮助程序设计人员更方便地进行程序的设计和调试工作。地进行程序的设计和调试工作。1997年年ANSI C+委委员会将它们纳入了员会将它们纳入了ANSI C+标准,建议所有的标准,建议所有的C+编译系统都能实现这些功能
3、。这些工具是非常有用的,编译系统都能实现这些功能。这些工具是非常有用的,C+的使用者应当尽量使用这些工具。的使用者应当尽量使用这些工具。长锌涉麦统磐馆涩虫猴秽沦噪缮缆述隔授殊壤秸悦绪乎快烫式嗜谴里长屡中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章程序编制者不仅要考虑程序没有错误的理想情况,更程序编制者不仅要考虑程序没有错误的理想情况,更要考虑程序存在错误时
4、的情况,应该能够尽快地发现要考虑程序存在错误时的情况,应该能够尽快地发现错误,消除错误。错误,消除错误。程序中常见的错误有两大类程序中常见的错误有两大类: 语法错误和运行错误。语法错误和运行错误。在编译时,编译系统能发现程序中的语法错误。在编译时,编译系统能发现程序中的语法错误。有的程序虽然能通过编译,也能投入运行。但是在运有的程序虽然能通过编译,也能投入运行。但是在运行过程中会出现异常,得不到正确的运行结果,甚至行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止,或出现死机现象。这类错误比导致程序不正常终止,或出现死机现象。这类错误比较隐蔽,不易被发现,往往耗费许多时间和精力。
5、这较隐蔽,不易被发现,往往耗费许多时间和精力。这成为程序调试中的一个难点。成为程序调试中的一个难点。14.1 异常处理异常处理 14.1.1 异常处理的任务异常处理的任务枝哼撩柯幂窃绝琶醚腰赔曾蜀数荧拨蕉睦挎谭狄缉驭泞妊阿忌几毒柏似门中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在设计程序时,应当事先分析程序运行时可能出现的在设计程序时,应当事先分析程序运
6、行时可能出现的各种意外的情况,并且分别制订出相应的处理方法,各种意外的情况,并且分别制订出相应的处理方法,这就是程序的异常处理的任务。这就是程序的异常处理的任务。在运行没有异常处理的程序时,如果运行情况出现异在运行没有异常处理的程序时,如果运行情况出现异常,由于程序本身不能处理,程序只能终止运行。如常,由于程序本身不能处理,程序只能终止运行。如果在程序中设置了异常处理机制,则在运行情况出现果在程序中设置了异常处理机制,则在运行情况出现异常时,由于程序本身已规定了处理的方法,于是程异常时,由于程序本身已规定了处理的方法,于是程序的流程就转到异常处理代码段处理。用户可以指定序的流程就转到异常处理代
7、码段处理。用户可以指定进行任何的处理。进行任何的处理。需要说明,只要出现与人们期望的情况不同,都可以需要说明,只要出现与人们期望的情况不同,都可以认为是异常,并对它进行异常处理。因此,所谓异常认为是异常,并对它进行异常处理。因此,所谓异常处理指的是对运行时出现的差错以及其他例外情况的处理指的是对运行时出现的差错以及其他例外情况的处理。处理。袍郝住履殆面溪晓沛辟食忽狗笔魂菇逞胁术阅娇戒绪晌狼悸最土玖寸证忱中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机
8、基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在一个小的程序中,可以用比较简单的方法处理异常。在一个小的程序中,可以用比较简单的方法处理异常。但是在一个大的系统中,如果在每一个函数中都设置但是在一个大的系统中,如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大。因此,处理异常的程序段,会使程序过于复杂和庞大。因此,C+采取的办法是采取的办法是: 如果在执行一个函数过程中出现如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信异常,可以不在本函数中立即处理,而是发出一个信息,传给它的上一级息,传给它的上一级(即调
9、用它的函数即调用它的函数),它的上级捕,它的上级捕捉到这个信息后进行处理。如果上一级的函数也不能捉到这个信息后进行处理。如果上一级的函数也不能处理,就再传给其上一级,由其上一级处理。如此逐处理,就再传给其上一级,由其上一级处理。如此逐级上送,如果到最高一级还无法处理,最后只好异常级上送,如果到最高一级还无法处理,最后只好异常终止程序的执行。终止程序的执行。14.1.2 异常处理的方法异常处理的方法秧权助谴郝侧何策咏瓶癣谅胃盖银滚衬荆刻钎玄廷守遗恍刊煤令抗间筒究中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝
10、搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章这样做使异常的发现与处理不由同一函数来完成。好这样做使异常的发现与处理不由同一函数来完成。好处是使底层的函数专门用于解决实际任务,而不必再处是使底层的函数专门用于解决实际任务,而不必再承担处理异常的任务,以减轻底层函数的负担,而把承担处理异常的任务,以减轻底层函数的负担,而把处理异常的任务上移到某一层去处理。这样可以提高处理异常的任务上移到某一层去处理。这样可以提高效率。效率。C+处理异常的机制是由处理异常的机制是由3个部分组成的,即检查个部分
11、组成的,即检查(try)、抛出、抛出(throw)和捕捉和捕捉(catch)。把需要检查的语。把需要检查的语句放在句放在try块中,块中,throw用来当出现异常时发出一个异用来当出现异常时发出一个异常信息,而常信息,而catch则用来捕捉异常信息,如果捕捉到则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。了异常信息,就处理它。朴府莱足胸选款辟嫁久触熙怨乏同沛谗拿涯侨殴镐蔷依磺氦鲍阂暇拱傍搬中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育
12、课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章例例14.1 给出三角形的三边给出三角形的三边a,b,c,求三角形的面积。只,求三角形的面积。只有有a+bc,b+ca,c+ab时才能构成三角形。设置异常时才能构成三角形。设置异常处理,对不符合三角形条件的输出警告信息,不予计处理,对不符合三角形条件的输出警告信息,不予计算。算。先写出没有异常处理时的程序先写出没有异常处理时的程序:#include #include using namespace std;int main( )double triangle(double,double,double); do
13、uble a,b,c; cinabc; while(a0 & b0 & c0) couttriangle(a,b,c)abc; return 0;豹滞歼矽产疡绚假狂暇研跳绳且瞪蕾挂饰酒摆士拽蝗随拜伟碘延浚芯扯熊中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章double triangle(double a,double b,double c)double a
14、rea; double s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); return area;运行情况如下运行情况如下:6 5 4 (输入输入a,b,c的值的值) 9.92157 (输出三角形的面积输出三角形的面积)1 1.5 2 (输入输入a,b,c的值的值)0.726184 (输出三角形的面积输出三角形的面积)1 2 1 (输入输入a,b,c的值的值)0 (输出三角形的面积,此结果显然不对输出三角形的面积,此结果显然不对,因为不是三角形因为不是三角形)1 0 6 (输入输入a,b,c的值的值) (结束结束)品冉卷埂寻恃跑识硷南史猎谁忱沏派帕磨心境篱
15、烬本拌矩案探志惜确迢连中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章修改程序,在函数修改程序,在函数traingle中对三角形条件进行检查,中对三角形条件进行检查,如果不符合三角形条件,就抛出一个异常信息,在主如果不符合三角形条件,就抛出一个异常信息,在主函数中的函数中的try-catch块中调用块中调用traingle函数,检测有无函数,检测有无异常信息
16、,并作相应处理。修改后的程序如下异常信息,并作相应处理。修改后的程序如下:#include #include using namespace std;void main( )double triangle(double,double,double); double a,b,c; cinabc; try/在在try块中包含要检查的函数块中包含要检查的函数 while(a0 & b0 & c0) couttriangle(a,b,c)abc; 啥妆蹿厉戮臭蕴哪道贮撕潭看哄苇孟降眷碱设订锨辅揽贫磁账烂砰婿锯悼中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规
17、划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章 catch(double) /用用catch捕捉异常信息并作相应处理捕捉异常信息并作相应处理 couta=a,b=b,c=c,that is not a triangle!endl; coutendendl;double triangle(double a,double b,double c) /计算三角形的面积的函数计算三角形的面积的函数double s=(a+b+c)/2; if (a+b=c|
18、b+c=a|c+a=b) throw a; /当不符合三角形条件抛出异常信息当不符合三角形条件抛出异常信息 return sqrt(s*(s-a)*(s-b)*(s-c);程序运行结果如下程序运行结果如下:6 5 4 (输入输入a,b,c的值的值) 9.92157 (计算出三角形的面积计算出三角形的面积)1 1.5 2 (输入输入a,b,c的值的值)0.726184 (计算出三角形的面积计算出三角形的面积)1 2 1 (输入输入a,b,c的值的值)a=1,b=2,c=1, that is not a triangle! (异常处理异常处理)end奄漆淬步舜匈眉敖哮队暴鹏淆赫板劳胀琴腻蛤鹅替深臃
19、托等炮绘策蝇列机中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章现在结合程序分析怎样进行异常处理。现在结合程序分析怎样进行异常处理。(1) 首先把可能出现异常的、需要检查的语句或程序首先把可能出现异常的、需要检查的语句或程序段放在段放在try后面的花括号中。后面的花括号中。(2) 程序开始运行后,按正常的顺序执行到程序开始运行后,按正常的顺序执行到try块,
20、开块,开始执行始执行try块中花括号内的语句。如果在执行块中花括号内的语句。如果在执行try块内块内的语句过程中没有发生异常,则的语句过程中没有发生异常,则catch子句不起作用,子句不起作用,流程转到流程转到catch子句后面的语句继续执行。子句后面的语句继续执行。(3) 如果在执行如果在执行try块内的语句块内的语句(包括其所调用的函数包括其所调用的函数)过程中发生异常,则过程中发生异常,则throw运算符抛出一个异常信息。运算符抛出一个异常信息。throw抛出异常信息后,流程立即离开本函数,转到抛出异常信息后,流程立即离开本函数,转到其上一级的函数其上一级的函数(main 函数函数)。t
21、hrow抛出什么样的数据由程序设计者自定,可以是抛出什么样的数据由程序设计者自定,可以是任何类型的数据。任何类型的数据。侠盛倘夕探镜快裹搐醒三掷讹篷穴吝溺站厄睦艇说龚靖厉芭碎巾靠洋吟篙中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(4) 这个异常信息提供给这个异常信息提供给try-catch结构,系统会寻找结构,系统会寻找与之匹配的与之匹配的catch子句
22、。子句。(5) 在进行异常处理后,程序并不会自动终止,继续在进行异常处理后,程序并不会自动终止,继续执行执行catch子句后面的语句。子句后面的语句。由于由于catch子句是用来处理异常信息的,往往被称为子句是用来处理异常信息的,往往被称为catch异常处理块或异常处理块或catch异常处理器。异常处理器。毅溯银蟹耐嫌诲唱媒流菠昼凯诊陛蚂姚接夸课搓拥组泡规恐眉秋往瑰作蛤中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第1
23、4章中国高等院校计算机基础教育课程体系规划教材讲授-第14章下面讲述异常处理的语法。下面讲述异常处理的语法。throw语句一般是由语句一般是由throw运算符和一个数据组成的,运算符和一个数据组成的,其形式为其形式为throw 表达式表达式;try-catch的结构为的结构为try 被检查的语句被检查的语句 catch(异常信息类型异常信息类型 变量名变量名) 进行异常处理的语句进行异常处理的语句褒识空惕扎谢舵呜燃燃辊贾醚仙棉铆恰浮到哼败视录漱忿点决色湿万渭桓中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝
24、搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章说明说明:(1) 被检测的函数必须放在被检测的函数必须放在try块中,否则不起作用。块中,否则不起作用。(2) try块和块和catch块作为一个整体出现,块作为一个整体出现,catch块是块是try-catch结构中的一部分,必须紧跟在结构中的一部分,必须紧跟在try块之后,不能块之后,不能单独使用,在二者之间也不能插入其他语句。但是在单独使用,在二者之间也不能插入其他语句。但是在一个一个try-catch结构中,可以只有结构中,可以只有tr
25、y块而无块而无catch块。块。即在本函数中只检查而不处理,把即在本函数中只检查而不处理,把catch处理块放在处理块放在其他函数中。其他函数中。(3) try和和catch块中必须有用花括号括起来的复合语句,块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。即使花括号内只有一个语句,也不能省略花括号。(4) 一个一个try-catch结构中只能有一个结构中只能有一个try块,但却可以块,但却可以有多个有多个catch块,以便与不同的异常信息匹配。块,以便与不同的异常信息匹配。箩摊盆两冰悔龟床央侯烹芜开饯婆渝酒酬茄氯割嗜散音滓褒碧踢预仙燎蛙中国高等院校计算机基础教
26、育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(5) catch后面的圆括号中,一般只写异常信息的类型后面的圆括号中,一般只写异常信息的类型名,名, 如如catch(double)catch只检查所捕获异常信息的类型,而不检查它们只检查所捕获异常信息的类型,而不检查它们的值。因此如果需要检测多个不同的异常信息,应当的值。因此如果需要检测多个不同的异常信息,应当由由throw抛出不
27、同类型的异常信息。抛出不同类型的异常信息。异常信息可以是异常信息可以是C+系统预定义的标准类型,也可以系统预定义的标准类型,也可以是用户自定义的类型是用户自定义的类型(如结构体或类如结构体或类)。如果由。如果由throw抛出的信息属于该类型或其子类型,则抛出的信息属于该类型或其子类型,则catch与与throw二者匹配,二者匹配,catch捕获该异常信息。捕获该异常信息。catch还可以有另外一种写法,即除了指定类型名外,还可以有另外一种写法,即除了指定类型名外,还指定变量名,如还指定变量名,如catch(double d)痹吼丝抢硷茹戳甭顾薄诀缩巳艺亭阻长卡危粪轴蚀癣胖扒庚惧含衣逗楼腔中国高
28、等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章此时如果此时如果throw抛出的异常信息是抛出的异常信息是double型的变量型的变量a,则则catch在捕获异常信息在捕获异常信息a的同时,还使的同时,还使d获得获得a的值,的值,或者说或者说d得到得到a的一个拷贝。什么时候需要这样做呢的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用?有时希望在
29、捕获异常信息时,还能利用throw抛出抛出的值,如的值,如catch(double d) coutthrow d;这时会输出这时会输出d的值的值(也就是也就是a值值)。当抛出的是类对象时,。当抛出的是类对象时,有时希望在有时希望在catch块中显示该对象中的某些信息。这块中显示该对象中的某些信息。这时就需要在时就需要在catch的参数中写出变量名的参数中写出变量名(类对象名类对象名)。(6) 如果在如果在catch子句中没有指定异常信息的类型,而子句中没有指定异常信息的类型,而用了删节号用了删节号“”,则表示它可以捕捉任何类型的异常,则表示它可以捕捉任何类型的异常信息,如信息,如滩屎毁杰堰嚎矣
30、淳日棒敏即瓮芽席澜埂摆好疙赤睦乔妙鬼等俺翼邮渺稀亦中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章catch() coutOKendl;它能捕捉所有类型的异常信息,并输出它能捕捉所有类型的异常信息,并输出OK。这种这种catch子句应放在子句应放在trycatch结构中的最后,相结构中的最后,相当于当于“其他其他”。如果把它作为第一个。如果把它作为第一个ca
31、tch子句,则后子句,则后面的面的catch子句都不起作用。子句都不起作用。(7) trycatch结构可以与结构可以与throw出现在同一个函数出现在同一个函数中,也可以不在同一函数中。当中,也可以不在同一函数中。当throw抛出异常信息抛出异常信息后,首先在本函数中寻找与之匹配的后,首先在本函数中寻找与之匹配的catch,如果在,如果在本函数中无本函数中无trycatch结构或找不到与之匹配的结构或找不到与之匹配的catch,就转到离开出现异常最近的,就转到离开出现异常最近的trycatch结构结构去处理。去处理。狐绸南倍境徐军让住雏褒护党皖悠报酗驰架绘析差喀瘤循虚贼屎衰炭味菌中国高等院校
32、计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(8) 在某些情况下,在在某些情况下,在throw语句中可以不包括表达式,语句中可以不包括表达式,如如throw;表示表示“我不处理这个异常,请上级处理我不处理这个异常,请上级处理”。(9) 如果如果throw抛出的异常信息找不到与之匹配的抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数块,那么系统
33、就会调用一个系统函数terminate,使程序终止运行。,使程序终止运行。例例14.2 在函数嵌套的情况下检测异常处理。在函数嵌套的情况下检测异常处理。这是一个简单的例子,用来说明在这是一个简单的例子,用来说明在try块中有函数嵌块中有函数嵌套调用的情况下抛出异常和捕捉异常的情况。请自己套调用的情况下抛出异常和捕捉异常的情况。请自己先分析以下程序。先分析以下程序。跺仔育甭塘藩蕴施晤足呛而鹅展拯仔偏兽出梆程仓酥径磊迄冠倔匹京碴厘中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱
34、剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章#include using namespace std;int main( )void f1( ); try f1( );/调用调用f1( ) catch(double) coutOK0!endl; coutend0endl; return 0;void f1( )void f2( ); try f2( ); /调用调用f2( ) catch(char) coutOK1!; coutend1endl;诞囚搐呵绦酿蝗吮匡绰浓里赵森遏架善右包汉过笼钨劈骗减猖夕顽终凯喉中国高等院校
35、计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章void f2( )void f3( ); try f3( ); /调用调用f3( ) catch(int) coutOk2!endl; coutend2endl;void f3( )double a=0; try throw a; /抛出抛出double类型异常信息类型异常信息 catch(float) coutOK3!
36、endl; coutend3endl;敷隔虐肚起丛缮怖斑疲魄戚阮瞎般要蛙萧哭疗嘱蕉曳澜塑棋贫宏贾恒旷筐中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章分分3种情况分析运行情况种情况分析运行情况: (1) 执行上面的程序。图执行上面的程序。图14.1为有函数嵌套时异常为有函数嵌套时异常处理示意图。处理示意图。图图14.1程序运行结果如下程序运行结果如下: OK
37、0!(在主函数中捕获异常在主函数中捕获异常)end0 (执行主函数中最后一个语句时的输出执行主函数中最后一个语句时的输出)祝玄刹章贡厕怖文老桥董判俊穷垮哀南吼郎氏舜门焚听絮俭肌孙镁溶痊中中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(2) 如果将如果将f3函数中的函数中的catch子句改为子句改为catch(double),而程序中其他部分不变,则程序运行
38、结果如下而程序中其他部分不变,则程序运行结果如下:OK3!(在在f3函数中捕获异常函数中捕获异常)end3 (执行执行f3函数中最后一个语句时的输出函数中最后一个语句时的输出)end2 (执行执行f2函数中最后一个语句时的输出函数中最后一个语句时的输出)end1 (执行执行f1函数中最后一个语句时的输出函数中最后一个语句时的输出)end0 (执行主函数中最后一个语句时的输出执行主函数中最后一个语句时的输出)(3) 如果在此基础上再将如果在此基础上再将f3函数中的函数中的catch块改为块改为catch(double) coutOK3!endl;throw;程序运行结果如下程序运行结果如下: O
39、K3!(在在f3函数中捕获异常函数中捕获异常)OK0! (在主函数中捕获异常在主函数中捕获异常)end0 (执行主函数中最后一个语句时的输出执行主函数中最后一个语句时的输出)叠底橱贮雪铁僧疥毁跋喇托锨惊校诱哈共颅芋湛倍兼妨钻舰赐场管线起俄中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章为便于阅读程序,使用户在看程序时能够知道所用的为便于阅读程序,使用户在看程
40、序时能够知道所用的函数是否会抛出异常信息以及异常信息可能的类型,函数是否会抛出异常信息以及异常信息可能的类型,C+允许在声明函数时列出可能抛出的异常类型,如允许在声明函数时列出可能抛出的异常类型,如可以将例可以将例14.1中第二个程序的第中第二个程序的第3行改写为行改写为double triangle(double,double,double) throw(double);表示表示triangle函数只能抛出函数只能抛出double类型的异常信息。类型的异常信息。如果写成如果写成double triangle(double,double,double) throw(int,double,flo
41、at,char);则表示则表示triangle函数可以抛出函数可以抛出int,double,float或或char类类型的异常信息。异常指定是函数声明的一部分,必须型的异常信息。异常指定是函数声明的一部分,必须同时出现在函数声明和函数定义的首行中,否则在进同时出现在函数声明和函数定义的首行中,否则在进行函数的另一次声明时,编译系统会报告行函数的另一次声明时,编译系统会报告“类型不匹类型不匹配配”。14.1.3 在函数声明中进行异常情况指定在函数声明中进行异常情况指定养债失侈迅选卸咋论薛蛹倔疗饵且睛骆昂像燕蝎病抄王枷信钮冈匹坦袁簿中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院
42、校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章如果在声明函数时未列出可能抛出的异常类型,则该如果在声明函数时未列出可能抛出的异常类型,则该函数可以抛出任何类型的异常信息。如例函数可以抛出任何类型的异常信息。如例14.1中第中第2个程序中所表示的那样。个程序中所表示的那样。如果想声明一个不能抛出异常的函数,可以写成以下如果想声明一个不能抛出异常的函数,可以写成以下形式形式:double triangle(double,do
43、uble,double) throw();/throw无参数无参数这时即使在函数执行过程中出现了这时即使在函数执行过程中出现了throw语句,实际语句,实际上也并不执行上也并不执行throw语句,并不抛出任何异常信息,语句,并不抛出任何异常信息,程序将非正常终止。程序将非正常终止。府剔援桨谁农骋甫浮待梭妈远枕径缉斗鞍霸榴谋键政凿铃抡筒蠢他袜费型中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础
44、教育课程体系规划教材讲授-第14章如果在如果在try块块(或或try块中调用的函数块中调用的函数)中定义了类对象,中定义了类对象,在建立该对象时要调用构造函数。在执行在建立该对象时要调用构造函数。在执行try块块 (包括包括在在try块中调用其他函数块中调用其他函数) 的过程中如果发生了异常,的过程中如果发生了异常,此时流程立即离开此时流程立即离开try块。这样流程就有可能离开该块。这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作,束对象前的清理工作,C+的异常处理机制会在的异常处理机制会在throw抛出异常信
45、息被抛出异常信息被catch捕获时,对有关的局部对捕获时,对有关的局部对象进行析构象进行析构(调用类对象的析构函数调用类对象的析构函数), 析构对象的顺析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句。块中的语句。14.1.4 在异常处理中处理析构函数在异常处理中处理析构函数雨浓高回习洪孤辖屎施厅湃盘体底相辩淳寝宿付锹仙即喝擒慢洒含喷终麓中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校
46、计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章例例14.3 在异常处理中处理析构函数。在异常处理中处理析构函数。这是一个为说明在异常处理中调用析构函数的示例,这是一个为说明在异常处理中调用析构函数的示例,为了清晰地表示流程,程序中加入了一些为了清晰地表示流程,程序中加入了一些cout语句,语句,输出有关的信息,以便对照结果分析程序。输出有关的信息,以便对照结果分析程序。#include #include using namespace std;class Studentpublic: Student(int n,string nam)/定义
47、构造函数定义构造函数coutconstructor-nendl;num=n;name=nam;Student( )coutdestructor-numendl;/定义析构函数定义析构函数 void get_data( ); /成员函数声明成员函数声明private:int num;string name; ;兴择膜边乒醚莆氧级扣舞君脆忙虚数攫锻拨钙穗姿藤铣叼钧挡甩躇惋泣译中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第
48、14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章void Student:get_data( ) /定义成员函数定义成员函数if(num=0) throw num; /如如num=0,抛出抛出int型变量型变量num else coutnum nameendl; /若若num0,输出,输出num,name coutin get_data()endl; /输出信息,表示目前在输出信息,表示目前在get_data函数中函数中 void fun( )Student stud1(1101,Tan); /建立对象建立对象stud1stud1.get_data( ); /调用调用stud1的
49、的get_data函数函数Student stud2(0,Li); /建立对象建立对象stud2stud2.get_data( ); /调用调用stud2的的get_data函数函数int main( )coutmain beginendl; /表示主函数开始了表示主函数开始了coutcall fun( )endl; /表示调用表示调用fun函数函数try fun( ); /调用调用fun函数函数窍朵铰压褒正误谎曰扎棱冶旦凯寄彦粘哟力谊癌寨轰坏识栈宾旷升品肘蛰中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝
50、搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章catch(int n) coutnum=n,error!endl; /表示表示num=0出错出错coutmain endendl; /表示主函数结束表示主函数结束return 0;程序运行结果如下程序运行结果如下:main begincall fun( )constructor-11011101 tanin get_data()constructor-0destructor-0destructor-1101num=0,error!main e
51、nd荡舱哀拆喇湛吴陨习漏琳刷悬铺蜜锌到唉叔纲定姻枝儿伯马柜坟扭停内眷中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在学习本书前面各章时,已经多次看到在程序中用了在学习本书前面各章时,已经多次看到在程序中用了以下语句以下语句: using namespace std;这就是使用了命名空间这就是使用了命名空间std。在本节中将对它作较详。在本节中将对它作较详细
52、的介绍。细的介绍。14.2 命名空间命名空间孔臀固挞恰游景色断洛篆弗党蔡殆溯纹执祟猪套菜喘浓檬翘村父距渐婪暂中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章命名空间是命名空间是ANSI C+引入的可以由用户命名的作用引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。域,用来处理程序中常见的同名冲突。在在C语言中定义了语言中定义了3个层次的作用域,即
53、文件个层次的作用域,即文件(编译单编译单元元) 、函数和复合语句。、函数和复合语句。C+又引入了类作用域,类又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不干扰,系统能够区别它们。名字的变量,互不干扰,系统能够区别它们。下面先简单分析一下作用域的作用,然后讨论命名空下面先简单分析一下作用域的作用,然后讨论命名空间的作用。间的作用。如果在文件中定义了两个类,在这两个类中可以有同如果在文件中定义了两个类,在这两个类中可以有同名的函数。在引用时,为了区别,应该加上类名作为名的函数。在引用时,为了区别,应该加上类名作为限定
54、,如限定,如14.2.1 为什么需要命名空间为什么需要命名空间级厅飞揽泡捌宠铡升综降钮蜂癣明捞是刁乐应焙胀添顿土廊焊华剔贤瞧掩中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章class A/声明声明A类类 public:void fun1( ); /声明声明A类中的类中的fun1函数函数 private:int i; ;void A:fun1( ) /定义定
55、义A类中的类中的fun1函数函数 / class B /声明声明B类类 public:void fun1( ); /B类中也有类中也有fun1函数函数void fun2( ); ;void B:fun1( ) /定义定义B类中的类中的fun1函数函数 / 节端恬桅镇彰碎茶雄坷二臣辞袍妆秤苔锹逾沟九颐灶予作隔福煽捏炯籍茶中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-
56、第14章这样不会发生混淆。这样不会发生混淆。在文件中可以定义全局变量在文件中可以定义全局变量(global variable),它的作,它的作用域是整个程序。如果在文件用域是整个程序。如果在文件A中定义了一个变量中定义了一个变量aint a=3;在文件在文件B中可以再定义一个变量中可以再定义一个变量aint a=5;在分别对文件在分别对文件A和文件和文件B进行编译时不会有问题。但进行编译时不会有问题。但是,如果一个程序包括文件是,如果一个程序包括文件A和文件和文件B,那么在进行,那么在进行连接时,会报告出错,因为在同一个程序中有两个同连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为
57、是对变量的重复定义。问题在于全局名的变量,认为是对变量的重复定义。问题在于全局变量的作用域是整个程序,在同一作用域中不应有两变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体个或多个同名的实体(entity),包括变量、函数和类,包括变量、函数和类等。等。 掀奢封蝇勘珠靛亢拈散壮尖栏选晋佣吉茄犯苹敞磨柴冯抹显磨现锄根殷仙中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体
58、系规划教材讲授-第14章可以通过可以通过extern声明同一程序中的两个文件中的同名声明同一程序中的两个文件中的同名变量是同一个变量。如果在文件变量是同一个变量。如果在文件B中有以下声明中有以下声明:extern int a;表示文件表示文件B中的变量中的变量a是在其他文件中已定义的变量。是在其他文件中已定义的变量。由于有此声明,在程序编译和连接后,文件由于有此声明,在程序编译和连接后,文件A的变量的变量a的作用域扩展到了文件的作用域扩展到了文件B。如果在文件。如果在文件B中不再对中不再对a赋值,则在文件赋值,则在文件B中用以下语句输出的是文件中用以下语句输出的是文件A中变中变量量 a的值的值
59、:couta;/得到得到a的值为的值为3在简单的程序设计中,只要人们小心注意,可以争取在简单的程序设计中,只要人们小心注意,可以争取不发生错误。但是,一个大型的应用软件,往往不是不发生错误。但是,一个大型的应用软件,往往不是由一个人独立完成的,假如不同的人分别定义了类,由一个人独立完成的,假如不同的人分别定义了类,放在不同的头文件中,在主文件放在不同的头文件中,在主文件(包含主函数的文件包含主函数的文件)需要用这些类时,需要用这些类时,绘拢凋彻嘎怎毯烧菠暮读毯舰恋避赖花慰腊受孜蒋刁异嫁语垦壶安双馏棺中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教
60、材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章就用就用#include命令行将这些头文件包含进来。由于各命令行将这些头文件包含进来。由于各头文件是由不同的人设计的,有可能在不同的头文件头文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数。这样在中用了相同的名字来命名所定义的类或函数。这样在程序中就会出现名字冲突。程序中就会出现名字冲突。例例14.4 名字冲突。名字冲突。程序员甲在头文件程序员甲在头文件header1.h
61、中定义了类中定义了类Student和函和函数数fun。/header1.h (头文件头文件1,设其文件名为,设其文件名为cc14-4-h1.h)#include #include using namespace std;class Student/声明声明Student类类public: Student(int n,string nam,char s)num=n;name=nam;sex=s; void get_data( );private:浙溶慕遏掘晦子邓盾幽妥殃酗级略釜婚溉悍饥宁卵冠账备朱醉崖宇朽左李中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体
62、系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章int num; string name; char sex; ;void Student:get_data( ) /成员函数定义成员函数定义coutnum name sexendl;double fun(double a,double b) /定义全局函数定义全局函数(即外部函数即外部函数)return sqrt(a+b);在在main函数所在的文件中包含头文件函数所在的文件中包含头文件head
63、er1.h:#include #include cc14-4-h1.h /注意要用双引号,因为文件一般是放在用户目录中的注意要用双引号,因为文件一般是放在用户目录中的using namespace std;int main( )Student stud1(101,Wang,18); /定义类对象定义类对象stud1 stud1.get_data( ); coutfun(5,3)endl; return 0; 什径句拂紧溢纯拼域返瞧等振攀儡爸栖绚逛晨播漏专拐黑檄痛构铲幌舵免中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕
64、价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章程序能正常运行,输出为程序能正常运行,输出为101 Wang 182.82843如果程序员乙写了头文件如果程序员乙写了头文件header2.h,在其中除了定,在其中除了定义其他类以外,还定义了类义其他类以外,还定义了类Student和函数和函数fun,但其,但其内容与头文件内容与头文件header1.h中的中的Student和函数和函数fun有所不有所不同。同。/header2.h (头文件头文件2,设其文件名为,设其文件名为cc1
65、4-4-h2.h)#include #include using namespace std;class Student/声明声明Student类类public: Student(int n,string nam,char s) /参数与参数与header1中的中的student不同不同num=n;name=nam;sex=s; void get_data( );医肺卵直务队栅榴叁俄阳忻控谆临毒砰贯澡崇少爵便剑娜冶凄妖庙臭培桶中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱
66、剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章private: int num; string name; char sex; /此项与此项与header1不同不同;void Student:get_data( ) /成员函数定义成员函数定义coutnum name sexendl;double fun(double a,double b) /定义全局函数定义全局函数 return sqrt(a-b); /返回值与返回值与header1中的中的fun函数不同函数不同/头文件头文件2中可能还有其他内容中可能还有其他内容假如主
67、程序员在其程序中要用到假如主程序员在其程序中要用到header1.h中的中的Student和函数和函数fun,因而在程序中包含了头文件,因而在程序中包含了头文件header1.h,同时要用到头文件,同时要用到头文件header2.h中的一些内中的一些内容,因而在程序中又包含了头文件容,因而在程序中又包含了头文件header2.h。如果。如果主文件主文件(包含主函数的文件包含主函数的文件)如下如下:田桩戌烛匀斗镍坚蝴稀妄万崭俯蚀耕页反滩哥隆函馁略闷芍渝龄超刚岂枫中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝
68、搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章/main file#include #include cc14-4-h1.h/包含头文件包含头文件1#include cc14-4-h2.h /包含头文件包含头文件2using namespace std;int main( )Student stud1(101,Wang,18);stud1.get_data();coutfun(5,3)endl;return 0; 这时程序编译就会出错。这时程序编译就会出错。 因为在预编译后,头文件因为在预
69、编译后,头文件中的内容取代了对应的中的内容取代了对应的#include命令行,这样就在同命令行,这样就在同一个程序文件中出现了两个一个程序文件中出现了两个Student类和两个类和两个fun函数,函数,显然是重复定义,这就是名字冲突,即在同一个作用显然是重复定义,这就是名字冲突,即在同一个作用域中有两个或多个同名的实体。域中有两个或多个同名的实体。复靠同支亭佩藤究限群戚抄翁促洲汾兄占腑忻林疡枫跋熙析壶嫡蹈苹澳穿中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院
70、校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章不仅如此,在程序中还往往需要引用一些库,为此需不仅如此,在程序中还往往需要引用一些库,为此需要包含有关的头文件。如果在这些库中包含有与程序要包含有关的头文件。如果在这些库中包含有与程序的全局实体同名的实体,或者不同的库中有相同的实的全局实体同名的实体,或者不同的库中有相同的实体名,则在编译时就会出现名字冲突。体名,则在编译时就会出现名字冲突。为了避免这类问题的出现,人们提出了许多方法,例为了避免这类问题的出现,人们提出了许多方法,例如如: 将实体的名字写得长一些;把名字起得特殊一些,将实体的名
71、字写得长一些;把名字起得特殊一些,包括一些特殊的字符;由编译系统提供的内部全局标包括一些特殊的字符;由编译系统提供的内部全局标识符都用下划线作为前缀,如识符都用下划线作为前缀,如_complex(),以避免与,以避免与用户命名的实体同名;由软件开发商提供的实体的名用户命名的实体同名;由软件开发商提供的实体的名字用特定的字符作为前缀。但是这样的效果并不理想,字用特定的字符作为前缀。但是这样的效果并不理想,而且增加了阅读程序的难度,可读性降低了。而且增加了阅读程序的难度,可读性降低了。巨澎晓帮挟虱肛官裸揖昆基侮长器暇笨袱痹燎儒氮侄数需闪元季矩雹喳惑中国高等院校计算机基础教育课程体系规划教材讲授-第
72、14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章C语言和早期的语言和早期的C+语言没有提供有效的机制来解决语言没有提供有效的机制来解决这个问题,没有使库的提供者能够建立自己的命名空这个问题,没有使库的提供者能够建立自己的命名空间的工具。人们希望间的工具。人们希望ANSI C+标准能够解决这个问标准能够解决这个问题,提供一种机制、一种工具,使由库的设计者命名题,提供一种机制、一种工具,使由库的设计者命名的全局
73、标识符能够和程序的全局实体名以及其他库的的全局标识符能够和程序的全局实体名以及其他库的全局标识符区别开来。全局标识符区别开来。搅臭看砌核提猿紫氮闺皇盔棒适萌妮粮污甸荣锋程寇腊纫屿托酋寨酉怒礼中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章为了解决上面这个问题,为了解决上面这个问题,ANSI C+增加了命名空间增加了命名空间(namespace)。所谓命名空间
74、,实际上就是一个由程。所谓命名空间,实际上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。如各个命名空间中,从而与其他全局实体分隔开来。如namespace ns1/指定命名空间指定命名空间ns1int a;double b;现在命名空间成员包括变量现在命名空间成员包括变量a和和b,注意,注意a和和b仍然是仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而全局变量,仅仅是把它们隐藏在指定的命名空间中而已
75、。已。14.2.2 什么是命名空间什么是命名空间拐袜骚千橱扫沪矫贫划凝飞搐惰锨萝量汞澄总卫搅鹊休忌月淬捶窘曝宇秽中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章如果在程序中要使用变量如果在程序中要使用变量a和和b,必须加上命名空间名,必须加上命名空间名和作用域分辨符和作用域分辨符“:”,如,如ns1:a,ns1:b。这种用法称。这种用法称为命名空间限定为命名
76、空间限定(qualified),这些名字,这些名字(如如ns1:a)称为称为被限定名被限定名(qualified name)。C+中命名空间的作用类中命名空间的作用类似于操作系统中的目录和文件的关系。似于操作系统中的目录和文件的关系。命名空间的作用是建立一些互相分隔的作用域,把一命名空间的作用是建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。些全局实体分隔开来,以免产生名字冲突。可以根据需要设置许多个命名空间,每个命名空间名可以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同代表一个不同的命名空间域,不同的命名空间不能同名。这样,可以
77、把不同的库中的实体放到不同的命名名。这样,可以把不同的库中的实体放到不同的命名空间中。过去我们用的全局变量可以理解为全局命名空间中。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要空间,独立于所有有名的命名空间之外,它是不需要用用namespace声明的,实际上是由系统隐式声明的,声明的,实际上是由系统隐式声明的,存在于每个程序之中。存在于每个程序之中。漫甥胁花黑勘蜀絮赣亮墨腻羹详耘硒陛盂岂挟碉葱鉴切眠棵岿妨瞒皖啃厄中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲
78、半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在声明一个命名空间时,花括号内不仅可以包括变量,在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型而且还可以包括以下类型: 变量变量(可以带有初始化可以带有初始化);常量;常量;函数函数(可以是定义或声明可以是定义或声明);结构体;结构体;类;类;模板;模板;命名空间命名空间(在一个命名空间中又定义一个命名空间,在一个命名空间中又定义一个命名空间,即嵌套的命名空间即嵌套的命名空间)。例如例如阉耽植悸探膏阿阑兰还扒篇掠缔逮屋识鼠兄沤舰
79、扫托剿乃扩铬疑樱湃编逛中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章namespace ns1const int RATE=0.08;/常量常量double pay; /变量变量double tax( ) /函数函数return a*RATE;namespace ns2 /嵌套的命名空间嵌套的命名空间 int age;如果想输出命名空间如果想输出命名空间n
80、s1中成员的数据,可以采用下中成员的数据,可以采用下面的方法面的方法:coutns1:RATEendl;coutns1:payendl;coutns1:tax()endl;coutns1:ns2:ageendl;/需要指定外层的和内层的命名空间名需要指定外层的和内层的命名空间名耪族疽蔑锡札瓮钧封颠青灵镜祖爆亨哮挪闹楚自蕉罪嗜首噶胖凋档喇赔熊中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育
81、课程体系规划教材讲授-第14章现在,对例现在,对例14.4程序进行修改,使之能正确运行。程序进行修改,使之能正确运行。例例14.5 利用命名空间来解决例利用命名空间来解决例14.4程序名字冲突问题。程序名字冲突问题。修改两个头文件,把在头文件中声明的类分别放在两修改两个头文件,把在头文件中声明的类分别放在两个不同的命名空间中。个不同的命名空间中。/header1.h (头文件头文件1)#include #include using namespace std;namespace ns1/声明命名空间声明命名空间ns1class Student /在命名空间在命名空间ns1内声明内声明Stude
82、nt类类public:Student(int n,string nam,int a)14.2.3 使用命名空间解决名字冲突使用命名空间解决名字冲突舌蔡混房阐枚联蹭囤赞筏畜蚀撰革巢禹蹿翌逗获磺铂账夯瘸劝授冶熄楔炊中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章num=n;name=nam;age=a;void get_data( ); private:int
83、num;string name;int age; ; void Student:get_data() /定义成员函数定义成员函数 coutnum name ageendl; double fun(double a,double b) /在命名空间在命名空间ns1内定义内定义fun函数函数 return sqrt(a+b);/header2.h (头文件头文件2)#include #include 头革毡萝拳恕匠衔耪此遇荡相被儿粱吴逆曙孟簇颓赢涅流驱锹晚逮补幢罗中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝
84、搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章using namespace std;namespace ns2 /声明命名空间声明命名空间ns2 class Studentpublic:Student(int n,string nam,char s)num=n;name=nam;sex=s;void get_data( );private:int num;char name20;char sex;void Student:get_data( ) coutnum name sexendl;
85、double fun(double a,double b)return sqrt(a-b); 饲馆衰秀糙浇朵捷但曳咎糖轴舌隙均旦掏泽鼓大喳笆逝是储级挤填恕喇震中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章/main file (主文件主文件)#include #include cc14-5-h1.h /包含头文件包含头文件1#include cc14-5-
86、h2.h /包含头文件包含头文件2using namespace std;int main( )ns1:Student stud1(101,Wang,18); /用命名空间用命名空间ns1中声明的中声明的Student类定义类定义stud1stud1.get_data( ); /不要写成不要写成ns1:stud1.get_data( );coutns1:fun(5,3)endl; /调用命名空间调用命名空间ns1中的中的fun函数函数ns2:Student stud2(102,Li,f); /用命名空间用命名空间ns2中声明的中声明的Student类定义类定义stud2 stud2.get_d
87、ata( );coutns2:fun(5,3)endl; /调用命名空间调用命名空间ns1中的中的fun函数函数return 0; 蛊定膀秃彝低沛恳狈澳绰弱贤唯贩助枝腾鹤快署叼筹他涟妆翟腕虾挥尺驰中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章程序能顺利通过编译,并得到以下运行结果程序能顺利通过编译,并得到以下运行结果:101 Wang 18(对象对象stu
88、d1中的数据中的数据)2.82843 (5+3的开方值的开方值)102 Li f (对象对象stud2中的数据中的数据)1.41421 (5-3的开方值的开方值)牟奈瓣核掖毯搁轩享桑宏衅斤瑶火獭我仅即蛰砸槛淹省侣位哎惧粳侗趾盯中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在引用命名空间成员时,要用命名空间名和作用域分在引用命名空间成员时,要用命名空间名和作
89、用域分辨符对命名空间成员进行限定,以区别不同的命名空辨符对命名空间成员进行限定,以区别不同的命名空间中的同名标识符。即间中的同名标识符。即命名空间名命名空间名:命名空间成员名命名空间成员名这种方法是有效的,能保证所引用的实体有惟一的名这种方法是有效的,能保证所引用的实体有惟一的名字。但是如果命名空间名字比较长,尤其在有命名空字。但是如果命名空间名字比较长,尤其在有命名空间嵌套的情况下,为引用一个实体,需要写很长的名间嵌套的情况下,为引用一个实体,需要写很长的名字。在一个程序中可能要多次引用命名空间成员,就字。在一个程序中可能要多次引用命名空间成员,就会感到很不方便。会感到很不方便。为此,为此,
90、C+提供了一些机制,能简化使用命名空间成提供了一些机制,能简化使用命名空间成员的手续。员的手续。14.2.4 使用命名空间成员的方法使用命名空间成员的方法医桔兹伊螺玖吻性涸淫隔棋断梧报麓违盆峡马阑忘暇宜径泻拱褒哇挛顺寂中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(1) 使用命名空间别名使用命名空间别名可以为命名空间起一个别名可以为命名空间起一个别名(na
91、mespace alias),用来,用来代替较长的命名空间名。如代替较长的命名空间名。如namespace Television/声明命名空间,名为声明命名空间,名为Television 可以用一个较短而易记的别名代替它。如可以用一个较短而易记的别名代替它。如namespace TV = Television;/别名别名TV与原名与原名Television等价等价(2) 使用使用using 命名空间成员名命名空间成员名using后面的命名空间成员名必须是由命名空间限定后面的命名空间成员名必须是由命名空间限定的名字。例如的名字。例如using ns1:Student;using声明的有效范围是从
92、声明的有效范围是从using语句开始到语句开始到using所在所在的作用域结束。如果在以上的的作用域结束。如果在以上的using语句之后有以下语句之后有以下语句语句: 你冕刘勺摇靛迈岂额镍成揍囤懦辫塑窘拉铸浦瘫馈攒禾平艾透乍涕彭臼奴中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章Student stud1(101,Wang,18);/此处的此处的Studen
93、t相当于相当于ns1:Student上面的语句相当于上面的语句相当于ns1:Student stud1(101,Wang,18);又如又如using ns1:fun;/声明其后出现的声明其后出现的fun是属于命名空间是属于命名空间ns1中的中的funcoutfun(5,3)endl; /此处的此处的fun函数相当于函数相当于ns1:fun(5,3)显然,这可以避免在每一次引用命名空间成员时都用显然,这可以避免在每一次引用命名空间成员时都用命名空间限定,使得引用命名空间成员方便易用。命名空间限定,使得引用命名空间成员方便易用。但是要注意但是要注意: 在同一作用域中用在同一作用域中用using声明
94、的不同命名声明的不同命名空间的成员中不能有同名的成员。例如空间的成员中不能有同名的成员。例如using ns1:Student;/声明其后出现的声明其后出现的Student是命名空间是命名空间ns1中的中的Studentusing ns2:Student; /声明其后出现的声明其后出现的Student是命名空间是命名空间ns2中的中的StudentStudent stud1; /请问此处的请问此处的Student是哪个命名空间中的是哪个命名空间中的Student?产生了二义性,编译出错。产生了二义性,编译出错。枷刊萌硬蝴个包醒建社椭营玖莱络富式松韩篆里谊保茬症潞嘘剧然檄搬托中国高等院校计算机基
95、础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(3) 使用使用using namespace 命名空间名命名空间名能否在程序中用一个语句就能一次声明一个命名空间能否在程序中用一个语句就能一次声明一个命名空间中的全部成员呢?中的全部成员呢?C+提供了提供了using namespace语句来实现这一目的。语句来实现这一目的。using namespace语句的一般格式为语句的一
96、般格式为using namespace命名空间名;命名空间名;例如例如using namespace ns1;声明了在本作用域中要用到命名空间声明了在本作用域中要用到命名空间ns1中的成员,中的成员,在使用该命名空间的任何成员时都不必用命名空间限在使用该命名空间的任何成员时都不必用命名空间限定。如果在作了上面的声明后有以下语句定。如果在作了上面的声明后有以下语句:Student stud1(101,Wang,18);/Student隐含指命名空间隐含指命名空间ns1中的中的Studentcoutfun(5,3)endl; /这里的这里的fun函数是命名空间函数是命名空间ns1中的中的fun函数
97、函数枉轰荒悍澄谨酞猜贿故基买争腰今靛绰爆卫仑投房率毕干牙禄疙屡侠萍苑中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章在用在用using namespace声明的作用域中,命名空间声明的作用域中,命名空间ns1的成员就好像在全局域声明的一样。因此可以不必用的成员就好像在全局域声明的一样。因此可以不必用命名空间限定。显然这样的处理对写程序比较方便。命名空间限定。
98、显然这样的处理对写程序比较方便。但是如果同时用但是如果同时用using namespace声明多个命名空间声明多个命名空间时,往往容易出错。因此只有在使用命名空间数量很时,往往容易出错。因此只有在使用命名空间数量很少,以及确保这些命名空间中没有同名成员时才用少,以及确保这些命名空间中没有同名成员时才用using namespace语句。语句。截新铲躯杠甩委老钥熙办豁刀誓片碧践醉舍粱洋淀前苯只恋泞冈件革撼扩中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算
99、机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章以上介绍的是有名字的命名空间,以上介绍的是有名字的命名空间,C+还允许使用没还允许使用没有名字的命名空间,如在文件有名字的命名空间,如在文件A中声明了以下的无名中声明了以下的无名命名空间命名空间:namespace/命名空间没有名字命名空间没有名字void fun() /定义命名空间成员定义命名空间成员 coutOK.endl;由于命名空间没有名字,在其他文件中显然无法引用,由于命名空间没有名字,在其他文件中显然无法引用,它只在本文件的作用域内有效。无名命名空间的成员它只在本文件的作用域内有效。无名
100、命名空间的成员fun函数的作用域为文件函数的作用域为文件A。在文件。在文件A中使用无名命名中使用无名命名空间的成员,不必空间的成员,不必(也无法也无法)用命名空间名限定。如果用命名空间名限定。如果在文件在文件A中有以下语句中有以下语句:14.2.5 无名的命名空间无名的命名空间繁倾鹰晰长砒顿诊山检撼渍痹鞍尹档桌馅童凭埋烦扫循僳雅酉待服丝壁唱中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育
101、课程体系规划教材讲授-第14章fun();则执行无名命名空间中的成员则执行无名命名空间中的成员fun函数,输出函数,输出OK.。在本程序中的其他文件中也无法使用该在本程序中的其他文件中也无法使用该fun函数,也函数,也就是把就是把fun函数的作用域限制在本文件范围中。函数的作用域限制在本文件范围中。欠晚吨叶油箔侍耕访篮祟战躺跑沦拜盲嘎炼灯莱溅蜘荫胃述檄篱忌存岸渭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国
102、高等院校计算机基础教育课程体系规划教材讲授-第14章为了解决为了解决C+标准库中的标识符与程序中的全局标识标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义将不同库的标识符在不同的命名空间中定义(或声明或声明)。标准标准C+库的所有的标识符都是在一个名为库的所有的标识符都是在一个名为std的命的命名空间中定义的,或者说标准头文件名空间中定义的,或者说标准头文件(如如iostream)中中函数、类、对象和类模板是在命名空间函数、类、对象和类模板是在命名空间std中定义的。中定义的。这
103、样,在程序中用到这样,在程序中用到C+标准库时,需要使用标准库时,需要使用std作作为限定。如为限定。如std:coutOK.endl; /声明声明cout是在命名空间是在命名空间std中定义的流对象中定义的流对象14.2.6 标准命名空间标准命名空间std跃朱锌次妄饺瓣助挑枚垫嘉轨厘酶获惟豢丹悸穆述垛着卞拳凋职姿啤优拔中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授
104、-第14章在大多数的在大多数的C+程序中常用程序中常用using namespace语句对命语句对命名空间名空间std进行声明,这样可以不必对每个命名空间进行声明,这样可以不必对每个命名空间成员一一进行处理,在文件的开头加入以下成员一一进行处理,在文件的开头加入以下using namespace声明声明: using namespace std;这样,在这样,在std中定义和声明的所有标识符在本文件中中定义和声明的所有标识符在本文件中都可以作为全局量来使用。但是应当绝对保证在程序都可以作为全局量来使用。但是应当绝对保证在程序中不出现与命名空间中不出现与命名空间std的成员同名的标识符。由于的成
105、员同名的标识符。由于在命名空间在命名空间std中定义的实体实在太多,有时程序设中定义的实体实在太多,有时程序设计人员也弄不清哪些标识符已在命名空间计人员也弄不清哪些标识符已在命名空间std中定义中定义过,为减少出错机会,有的专业人员喜欢用若干个过,为减少出错机会,有的专业人员喜欢用若干个“using 命名空间成员命名空间成员” 声明来代替声明来代替“using namespace 命名空间命名空间”声明,如声明,如虑瘦跪批耿蚁抿桔漆掖摘依伤病蹬静粒窃炼弱蹄疏祸皇惩妨菊久凭瓣杏旭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠
106、滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章using std:string;using std:cout;using std:cin;等。为了减少在每一个程序中都要重复书写以上的等。为了减少在每一个程序中都要重复书写以上的using声明,程序开发者往往把编写应用程序时经常声明,程序开发者往往把编写应用程序时经常会用到的命名空间会用到的命名空间std成员的成员的using声明组成一个头文声明组成一个头文件,然后在程序中包含此头文件即可。件,然后在程序中包含此头文件即可。
107、宋树密嗅片涕城接选绥莎汪船睫戮颅桨高宝郧曾啤荡沧担孵坦矣侮忻及父中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章C语言程序中各种功能基本上都是由函数来实现的,语言程序中各种功能基本上都是由函数来实现的,在在C语言的发展过程中建立了功能丰富的函数库,语言的发展过程中建立了功能丰富的函数库,C+从从C语言继承了这份宝贵的财富。在语言继承了这份宝贵的财富。在C+程
108、序中程序中可以使用可以使用C语言的函数库。语言的函数库。如果要用函数库中的函数,就必须在程序文件中包含如果要用函数库中的函数,就必须在程序文件中包含有关的头文件,在不同的头文件中,包含了不同的函有关的头文件,在不同的头文件中,包含了不同的函数的声明。数的声明。在在C+中使用这些头文件有两种方法。中使用这些头文件有两种方法。14.3 使用早期的函数库使用早期的函数库解型堂阿嘎瑞就搭盏为岔烽斑含稍拨扁涵岂陆岭蒜纳拐远氛崭烈磨楼丑巨中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱
109、剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章(1) 用用C语言的传统方法。头文件名包括后缀语言的传统方法。头文件名包括后缀.h,如,如stdio.h,math.h等。由于等。由于C语言没有命名空间,头文语言没有命名空间,头文件并不存放在命名空间中,因此在件并不存放在命名空间中,因此在C+程序文件中如程序文件中如果用到带后缀果用到带后缀.h的头文件时,不必用命名空间。只需的头文件时,不必用命名空间。只需在文件中包含所用的头文件即可。如在文件中包含所用的头文件即可。如#include (2) 用用C+的新方法。的新方法。C+
110、标准要求系统提供的头文标准要求系统提供的头文件不包括后缀件不包括后缀.h,例如,例如iostream、string。为了表示与。为了表示与C语言的头文件有联系又有区别,语言的头文件有联系又有区别,C+所用的头文件所用的头文件名是在名是在C语言的相应的头文件名语言的相应的头文件名(但不包括后缀但不包括后缀.h)之之前加一字母前加一字母c。此外,由于这些函数都是在命名空间此外,由于这些函数都是在命名空间std中声明的,中声明的,因此在程序中要对命名空间因此在程序中要对命名空间std作声明。如作声明。如守厉愤蔫澈雁卿亡茬氖抵括监愿赫存炭秸席客那猩喇证濒颊书穿独纫魏囊中国高等院校计算机基础教育课程体系
111、规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章漾甭棠滩钒慕价矩单光坎膝搔耀蔓亲半伟铰匡赊膨垫选勃敌朵皋洱剔内潭中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章#include #include using namespace std;目前所用的大多数目前所用的大多数C+编译系统既保留了编译系统既保留了C的用法,的用法,又提供了又提供了C+的新方法。下面两种用法等价,可以任的新方法。下面两种用法等价,可以任选。选。C传统方法传统方法 C+新方法新方法#include #include #include #include #include #include using namespace std;可以使用传统的可以使用传统的C方法,但应当提倡使用方法,但应当提倡使用C+的新方的新方法。法。东赘颈吊茎斟牺拾舔该拐锄腹渴膨谭曰唤垛蜀吻汾雅奖适絮箔毁堡搏镶鞠中国高等院校计算机基础教育课程体系规划教材讲授-第14章中国高等院校计算机基础教育课程体系规划教材讲授-第14章