最新H面向?qū)ο?異常處理) YH_第1頁(yè)
最新H面向?qū)ο?異常處理) YH_第2頁(yè)
最新H面向?qū)ο?異常處理) YH_第3頁(yè)
最新H面向?qū)ο?異常處理) YH_第4頁(yè)
最新H面向?qū)ο?異常處理) YH_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1- 1-1 1知識(shí)回顧知識(shí)回顧i/oi/o流的概念流的概念輸出流輸出流輸入流輸入流2異常處理異常處理第八章第八章1- 1-3 3 理解異常處理的概念理解異常處理的概念 掌握異常處理的實(shí)現(xiàn)掌握異常處理的實(shí)現(xiàn) 掌握異常處理中對(duì)象的構(gòu)造與析構(gòu)掌握異常處理中對(duì)象的構(gòu)造與析構(gòu) 理解名字空間的概述理解名字空間的概述本章目標(biāo)本章目標(biāo)異常處理是異常處理是c+c+語(yǔ)言中重要的錯(cuò)誤處理機(jī)制,語(yǔ)言中重要的錯(cuò)誤處理機(jī)制,是提高程序容錯(cuò)性的一種手段。異常處理主要是提高程序容錯(cuò)性的一種手段。異常處理主要針對(duì)程序運(yùn)行時(shí)出現(xiàn)的各種異常情況,提供發(fā)針對(duì)程序運(yùn)行時(shí)出現(xiàn)的各種異常情況,提供發(fā)現(xiàn),捕獲異常的手段,并盡量減少異常對(duì)程

2、序現(xiàn),捕獲異常的手段,并盡量減少異常對(duì)程序運(yùn)行的影響。運(yùn)行的影響。有的程序雖然經(jīng)過(guò)編譯、連接成為可以運(yùn)行的有的程序雖然經(jīng)過(guò)編譯、連接成為可以運(yùn)行的程序,但在運(yùn)行過(guò)程中難免會(huì)出現(xiàn)各種各樣的問(wèn)程序,但在運(yùn)行過(guò)程中難免會(huì)出現(xiàn)各種各樣的問(wèn)題,即使對(duì)那些所謂能題,即使對(duì)那些所謂能“正常運(yùn)行正常運(yùn)行”的程序而言的程序而言也是如此。也是如此。程序中潛在的異常問(wèn)題程序中潛在的異常問(wèn)題提出問(wèn)題提出問(wèn)題示例:示例:#include #include using namespace std;int main()float a,b,c;double x1,x2;cout請(qǐng)輸入一元二次方程的系數(shù)請(qǐng)輸入一元二次方程的系數(shù)

3、a、b和和c的值的值:endl;couta;coutb;coutc;x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);cout方程的實(shí)根是方程的實(shí)根是:x1=x1endl;cout方程的實(shí)根是方程的實(shí)根是:x2=x2endl;return 0;從上面例子可以看出:能夠從上面例子可以看出:能夠“正常運(yùn)行正常運(yùn)行”的程序可能的程序可能存在著許多潛在的存在著許多潛在的“隱患隱患”。程序運(yùn)行可以檢測(cè)到的。程序運(yùn)行可以檢測(cè)到的一些非正常情況稱為異常(一些非正常情況稱為異常(exception)。)。如除數(shù)為如除數(shù)為0、數(shù)組越界訪問(wèn)、內(nèi)存空

4、間不夠、輸入、數(shù)組越界訪問(wèn)、內(nèi)存空間不夠、輸入/輸輸出不正常(文件找不到、輸入數(shù)據(jù)類型錯(cuò)等)等。出不正常(文件找不到、輸入數(shù)據(jù)類型錯(cuò)等)等。異常是程序錯(cuò)誤一種形式。異常是程序錯(cuò)誤一種形式。分析問(wèn)題分析問(wèn)題程序中的錯(cuò)誤按性質(zhì)可分為語(yǔ)法錯(cuò)誤、邏輯錯(cuò)程序中的錯(cuò)誤按性質(zhì)可分為語(yǔ)法錯(cuò)誤、邏輯錯(cuò)誤和異常誤和異常3種。種。一般來(lái)說(shuō),異常的檢測(cè)和處理要完成下列任務(wù)一般來(lái)說(shuō),異常的檢測(cè)和處理要完成下列任務(wù)之一:之一:(1)讓)讓“用戶用戶”知道程序出現(xiàn)了異常,并退出知道程序出現(xiàn)了異常,并退出程序。程序。(2)讓)讓“用戶用戶”知道程序出現(xiàn)了異常,允許知道程序出現(xiàn)了異常,允許“用戶用戶”選擇繼續(xù)使用程序。選擇繼續(xù)

5、使用程序。(3)在程序發(fā)生異常時(shí),能夠在不打擾)在程序發(fā)生異常時(shí),能夠在不打擾“用戶用戶”的情況下繼續(xù)程序的運(yùn)行。的情況下繼續(xù)程序的運(yùn)行。c+c+語(yǔ)言異常處理機(jī)制的基本思想是將異常的檢測(cè)與處理語(yǔ)言異常處理機(jī)制的基本思想是將異常的檢測(cè)與處理分離。當(dāng)在一個(gè)函數(shù)體中檢測(cè)到異常條件存在,但無(wú)法確分離。當(dāng)在一個(gè)函數(shù)體中檢測(cè)到異常條件存在,但無(wú)法確定相應(yīng)的處理方法時(shí),將引發(fā)一個(gè)異常,并由函數(shù)直接或定相應(yīng)的處理方法時(shí),將引發(fā)一個(gè)異常,并由函數(shù)直接或間接調(diào)用檢測(cè)并處理這個(gè)異常。間接調(diào)用檢測(cè)并處理這個(gè)異常。這一基本思想用這一基本思想用3 3個(gè)保留字實(shí)現(xiàn):個(gè)保留字實(shí)現(xiàn):throwthrow、trytry和和cat

6、chcatch。在。在一般情況下,被調(diào)用函數(shù)直接檢測(cè)到異常條件的存在并使一般情況下,被調(diào)用函數(shù)直接檢測(cè)到異常條件的存在并使用用throwthrow引發(fā)一個(gè)異常(注意,引發(fā)一個(gè)異常(注意,c+c+語(yǔ)言的異常是由程序員語(yǔ)言的異常是由程序員控制引發(fā)的,而不是由計(jì)算機(jī)硬件或程序運(yùn)行環(huán)境控制的控制引發(fā)的,而不是由計(jì)算機(jī)硬件或程序運(yùn)行環(huán)境控制的);在上層調(diào)用函數(shù)中使用);在上層調(diào)用函數(shù)中使用trytry檢測(cè)函數(shù)調(diào)用是否引發(fā)異檢測(cè)函數(shù)調(diào)用是否引發(fā)異常,檢測(cè)到的各種異常由常,檢測(cè)到的各種異常由catchcatch捕獲并作相應(yīng)處理。捕獲并作相應(yīng)處理。異常處理實(shí)現(xiàn)異常處理實(shí)現(xiàn)在在vc+6.0環(huán)境中,為了使用異常處

7、理機(jī)制,需要進(jìn)行環(huán)境中,為了使用異常處理機(jī)制,需要進(jìn)行如下設(shè)置(默認(rèn)設(shè)置):如下設(shè)置(默認(rèn)設(shè)置):(1)選擇菜單中的)選擇菜單中的project。(2)在彈出的下拉菜單中選擇)在彈出的下拉菜單中選擇setting命令,出現(xiàn)命令,出現(xiàn)settings對(duì)話框。對(duì)話框。(3)打開(kāi))打開(kāi)c/c+選項(xiàng)卡。選項(xiàng)卡。(4)在)在category中選擇中選擇 c+ language。(5)選中)選中enable exception handling復(fù)選框。復(fù)選框。在在c+程序中,任何需要檢測(cè)異常的語(yǔ)句(程序中,任何需要檢測(cè)異常的語(yǔ)句(包括函數(shù)調(diào)用)都必須在包括函數(shù)調(diào)用)都必須在try語(yǔ)句塊中執(zhí)行,語(yǔ)句塊中執(zhí)行

8、,異常必須由緊跟著異常必須由緊跟著try語(yǔ)句后面的語(yǔ)句后面的catch語(yǔ)句來(lái)語(yǔ)句來(lái)捕獲并處理。因而,捕獲并處理。因而,try與與catch總是結(jié)合使用總是結(jié)合使用。1、異常處理的語(yǔ)法、異常處理的語(yǔ)法throw、 try和和catch語(yǔ)句的一般語(yǔ)法如下:語(yǔ)句的一般語(yǔ)法如下:throw 表達(dá)式;表達(dá)式;try /try語(yǔ)句塊語(yǔ)句塊 catch(類型類型1 參數(shù)參數(shù)1) /針對(duì)類型針對(duì)類型1的異常處理的異常處理 catch(類型類型2 參數(shù)參數(shù)2) /針對(duì)類型針對(duì)類型1的異常處理的異常處理 .catch(類型(類型n 參數(shù)參數(shù)n) /針對(duì)類型針對(duì)類型1的異常處理的異常處理 異常處理的執(zhí)行過(guò)程如下:異

9、常處理的執(zhí)行過(guò)程如下:(1 1)控制通過(guò)正常的順序執(zhí)行到達(dá))控制通過(guò)正常的順序執(zhí)行到達(dá)trytry語(yǔ)句,然后執(zhí)行語(yǔ)句,然后執(zhí)行trytry塊內(nèi)的塊內(nèi)的保護(hù)段。保護(hù)段。(2 2)如果在保護(hù)段執(zhí)行期間沒(méi)有引起異常,那么跟在)如果在保護(hù)段執(zhí)行期間沒(méi)有引起異常,那么跟在trytry塊后的塊后的catchcatch子句就不執(zhí)行,程序從異常被拋擲的子句就不執(zhí)行,程序從異常被拋擲的trytry塊后跟隨的最后一個(gè)塊后跟隨的最后一個(gè)catchcatch子句后面的語(yǔ)句繼續(xù)執(zhí)行下去。子句后面的語(yǔ)句繼續(xù)執(zhí)行下去。(3 3)如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任何函數(shù)中(直接)如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任何函

10、數(shù)中(直接或間接的調(diào)用)有異常被拋擲,則從通過(guò)或間接的調(diào)用)有異常被拋擲,則從通過(guò)throwthrow運(yùn)算數(shù)創(chuàng)建的對(duì)象運(yùn)算數(shù)創(chuàng)建的對(duì)象中創(chuàng)建一個(gè)異常對(duì)象(可能包含一個(gè)復(fù)制構(gòu)造函數(shù))。中創(chuàng)建一個(gè)異常對(duì)象(可能包含一個(gè)復(fù)制構(gòu)造函數(shù))。(4 4)如果匹配的處理器未找到,則運(yùn)行函數(shù))如果匹配的處理器未找到,則運(yùn)行函數(shù)terminateterminate將被自動(dòng)調(diào)將被自動(dòng)調(diào)用,而函數(shù)用,而函數(shù)terminateterminate的默認(rèn)功能是調(diào)用的默認(rèn)功能是調(diào)用abortabort終止程序。終止程序。(5 5)如果找到了一個(gè)匹配的)如果找到了一個(gè)匹配的catchcatch處理程序,且它通過(guò)值進(jìn)行捕獲處理程

11、序,且它通過(guò)值進(jìn)行捕獲,則其形參通過(guò)復(fù)制異常對(duì)象進(jìn)行初始化。,則其形參通過(guò)復(fù)制異常對(duì)象進(jìn)行初始化。示例示例1:#include void main()char *buf;trybuf=new char512;if(buf=0)throw 內(nèi)存分配錯(cuò)誤內(nèi)存分配錯(cuò)誤!;cout內(nèi)存分配成功內(nèi)存分配成功!endl;catch(char *str)cout異常引發(fā)異常引發(fā):strendl;示例示例2:#include int fun(int);void main()trycout4!=fun(4)endl;cout-2!=fun(-2)endl;cout5!=fun(5);catch (int n)c

12、outn=n不能計(jì)算不能計(jì)算n!endl;cout程序執(zhí)行結(jié)束程序執(zhí)行結(jié)束.endl;int fun(int n)if(n=0)throw n;int s=1;for(int i=1;i=n;i+)s*=i;return s;catch處理程序的出現(xiàn)次序很重要,因?yàn)樵谝粋€(gè)處理程序的出現(xiàn)次序很重要,因?yàn)樵谝粋€(gè)try塊中,異常處理塊中,異常處理程序是按照它出現(xiàn)的次序檢查的。只要找到一個(gè)匹配的異常類型,程序是按照它出現(xiàn)的次序檢查的。只要找到一個(gè)匹配的異常類型,后面的異常處理都將被忽略。后面的異常處理都將被忽略。示例示例3:#include void fun(int code)tryif(code=0

13、) throw code; /引發(fā)引發(fā)int類型的異常類型的異常if(code=1) throw x; /引發(fā)引發(fā)char類型的異常類型的異常if(code=2) throw 12.345; /引發(fā)引發(fā)double類型的類型的異常異常catch(int n)cout捕獲整數(shù)類型:捕獲整數(shù)類型:nendl;catch(char c)cout捕獲字符類型:捕獲字符類型:cendl;catch(double d)cout捕獲雙精度類型:捕獲雙精度類型:dendl;return;void main()fun(0);fun(1);fun(2);程序中同時(shí)列出多個(gè)程序中同時(shí)列出多個(gè)catch語(yǔ)句時(shí),將以語(yǔ)

14、句時(shí),將以catch語(yǔ)句在程序中出現(xiàn)語(yǔ)句在程序中出現(xiàn)的次序作類型匹配,并且只有一個(gè)匹配的的次序作類型匹配,并且只有一個(gè)匹配的catch語(yǔ)句被執(zhí)行,其語(yǔ)句被執(zhí)行,其他的他的catch語(yǔ)句將被忽略。語(yǔ)句將被忽略。catch(.)是一個(gè)特殊的捕獲語(yǔ)句,可以捕獲任何異常,因而在是一個(gè)特殊的捕獲語(yǔ)句,可以捕獲任何異常,因而在任何情況下其他任何情況下其他catch子句都不被檢查。所以,子句都不被檢查。所以,catch(.)應(yīng)該放應(yīng)該放在最后。在在最后。在vc+6.0中,若中,若catch(.)不是放在所有不是放在所有catch(.)語(yǔ)句的最后,則會(huì)出現(xiàn)編譯錯(cuò)誤。語(yǔ)句的最后,則會(huì)出現(xiàn)編譯錯(cuò)誤。2、捕獲異常、

15、捕獲異常示例示例1:#include void fun(int code)tryif(code=0) throw code; /引發(fā)引發(fā)int類型的異常類型的異常 if(code=1) throw x; /引發(fā)引發(fā)char類型的異常類型的異常 if(code=2) throw 12.345; /引發(fā)引發(fā)double類型的異常類型的異常catch(int n) cout捕獲整數(shù)類型捕獲整數(shù)類型.nendl;catch(.) cout默認(rèn)捕獲默認(rèn)捕獲.endl;return;void main()fun(0);fun(1);fun(2);從前面異常處理的例子可以看出,調(diào)用一個(gè)函數(shù)時(shí),除從前面異常處

16、理的例子可以看出,調(diào)用一個(gè)函數(shù)時(shí),除了了解函數(shù)的參數(shù)與返回值外,還必須了解函數(shù)的異常了了解函數(shù)的參數(shù)與返回值外,還必須了解函數(shù)的異常引發(fā)方式,以便設(shè)計(jì)異常處理程序,應(yīng)付函數(shù)調(diào)用過(guò)程引發(fā)方式,以便設(shè)計(jì)異常處理程序,應(yīng)付函數(shù)調(diào)用過(guò)程中引發(fā)的異常。中引發(fā)的異常。異常的引發(fā)與捕獲已成為函數(shù)之間界面的一部分,有必異常的引發(fā)與捕獲已成為函數(shù)之間界面的一部分,有必要在函數(shù)原型中也列出異常引發(fā)。要在函數(shù)原型中也列出異常引發(fā)。例如:例如:void fun(int i) throw(t1,t2,t3);3、帶有異常聲明的函數(shù)原型、帶有異常聲明的函數(shù)原型c+的異常處理機(jī)制不僅能夠處理各種不同類型的異常,的異常處理機(jī)

17、制不僅能夠處理各種不同類型的異常,還具有為拋出異常前構(gòu)造所有局部對(duì)象自動(dòng)調(diào)用析構(gòu)函數(shù)還具有為拋出異常前構(gòu)造所有局部對(duì)象自動(dòng)調(diào)用析構(gòu)函數(shù)的能力。的能力。在程序中,找到一個(gè)匹配的在程序中,找到一個(gè)匹配的catch異常處理后,如果異常處理后,如果catch子句的異常類型說(shuō)明是一個(gè)值參數(shù),則其初始化方式是復(fù)子句的異常類型說(shuō)明是一個(gè)值參數(shù),則其初始化方式是復(fù)制被拋出的異常對(duì)象。如果制被拋出的異常對(duì)象。如果catch子句的異常類型說(shuō)明是子句的異常類型說(shuō)明是一個(gè)引用,則其初始化方式是使該引用指向異常對(duì)象。一個(gè)引用,則其初始化方式是使該引用指向異常對(duì)象。當(dāng)當(dāng)catch子句的異常類型說(shuō)明參數(shù)被初始化后,便于始展

18、子句的異常類型說(shuō)明參數(shù)被初始化后,便于始展開(kāi)棧的過(guò)程。這包括將從對(duì)應(yīng)的開(kāi)棧的過(guò)程。這包括將從對(duì)應(yīng)的try塊開(kāi)始到異常被拋出之塊開(kāi)始到異常被拋出之間構(gòu)造(且尚未析構(gòu))的所有自動(dòng)對(duì)象進(jìn)行析構(gòu)。析構(gòu)的間構(gòu)造(且尚未析構(gòu))的所有自動(dòng)對(duì)象進(jìn)行析構(gòu)。析構(gòu)的次序與構(gòu)造的次序相反。然后程序從最后一個(gè)次序與構(gòu)造的次序相反。然后程序從最后一個(gè)catch處理處理之后開(kāi)始恢復(fù)執(zhí)行。之后開(kāi)始恢復(fù)執(zhí)行。異常處理中對(duì)象的構(gòu)造與析構(gòu)異常處理中對(duì)象的構(gòu)造與析構(gòu)示例:示例:#include void fun(void);class apublic:a() ;a() ;const char *showreason() const

19、/異常處理成員函數(shù)異常處理成員函數(shù)return 異常在異常在a類中類中;class bpublic:b();b();b:b()coutb構(gòu)造函數(shù)構(gòu)造函數(shù)endl;b:b()coutb析構(gòu)函數(shù)析構(gòu)函數(shù)endl; void fun()b b;coutfun():拋擲一個(gè)拋擲一個(gè)a異常異常endl;throw a();void main()cout進(jìn)入進(jìn)入main()endl;trycout在在try塊中調(diào)用塊中調(diào)用fun()endl;fun();catch( a e)cout在在catch處理器捕獲一個(gè)異常類型:處理器捕獲一個(gè)異常類型:;coute.showreason()endl;catch(c

20、har *str)cout捕獲其他異常:捕獲其他異常:strendl;cout返回返回main()endl;在名字空間中可以放入這樣的聲明:類、變量(以及它在名字空間中可以放入這樣的聲明:類、變量(以及它們的初始化)、函數(shù)(以及它們的定義)、模板以及其們的初始化)、函數(shù)(以及它們的定義)、模板以及其他名字空間。從而這些變量或函數(shù)都與該名字空間相關(guān)他名字空間。從而這些變量或函數(shù)都與該名字空間相關(guān)聯(lián)。聯(lián)。名字空間概述名字空間概述1、名字空間的定義、名字空間的定義保留字(保留字(namespace)用于定義名字空間。名字空間必)用于定義名字空間。名字空間必須在程序的全局作用域內(nèi)定義,不能在函數(shù)內(nèi)或類

21、內(nèi)部須在程序的全局作用域內(nèi)定義,不能在函數(shù)內(nèi)或類內(nèi)部定義,最外層名字空間的名字必須在程序的全局作用域定義,最外層名字空間的名字必須在程序的全局作用域惟一。惟一。名字空間可以分多次定義,即可以先在初始定義中定義名字空間可以分多次定義,即可以先在初始定義中定義一部分成員,然后在擴(kuò)展定義中再定義另一部分成員,一部分成員,然后在擴(kuò)展定義中再定義另一部分成員,或者再定義初始時(shí)聲明函數(shù)原型。初始定義和擴(kuò)展定義或者再定義初始時(shí)聲明函數(shù)原型。初始定義和擴(kuò)展定義的語(yǔ)法格式相同。的語(yǔ)法格式相同。保留字保留字using用于聲明程序要引入的名字空間成員,或用于聲明程序要引入的名字空間成員,或都用于指示程序要引用的名字

22、空間。在聲明引用名字空都用于指示程序要引用的名字空間。在聲明引用名字空間的某個(gè)成員之前,成員必須已經(jīng)在名字空間中進(jìn)行了間的某個(gè)成員之前,成員必須已經(jīng)在名字空間中進(jìn)行了聲明或進(jìn)行了定義。聲明或進(jìn)行了定義。示例示例#include namespace ns1 /初始定義名字空間初始定義名字空間ns1extern int x; /說(shuō)明整型變量說(shuō)明整型變量xvoid fun(int); /說(shuō)明函數(shù)說(shuō)明函數(shù)fun(int)void fun(long) /定義函數(shù)定義函數(shù)fun(long)coutprocessing a long argument endl;namespace ns1 /擴(kuò)展定義名字空間

23、擴(kuò)展定義名字空間ns1int x=5; /定義整形變量定義整形變量xvoid fun(int) /定義函數(shù)定義函數(shù)fun(int)coutprocessing a int argumentendl;void main()int y=20;using ns1:x; /說(shuō)明引用變量說(shuō)明引用變量xusing:ns1:fun; /說(shuō)明引用函數(shù)說(shuō)明引用函數(shù)fun()x=10;fun(4);fun(4l);coutx=xendl;couty=yendl;1、訪問(wèn)名字空間的成員、訪問(wèn)名字空間的成員訪問(wèn)名字空間的成員有訪問(wèn)名字空間的成員有4種方式:種方式:(1)直接訪問(wèn)成員)直接訪問(wèn)成員格式如下:格式如下:名

24、字空間名字名字空間名字:成員名字成員名字因此,直接訪問(wèn)總能惟一地訪問(wèn)指定名字空間的成員。因此,直接訪問(wèn)總能惟一地訪問(wèn)指定名字空間的成員。(2)指定名字空間(使用)指定名字空間(使用using namespace 語(yǔ)句)語(yǔ)句)指定名字空間的格式如下:指定名字空間的格式如下:using namespace 名字空間;名字空間;/直接使用成員名字直接使用成員名字(3)聲明引用成員(使用)聲明引用成員(使用using語(yǔ)句)語(yǔ)句)聲明引用成員的格式如下:聲明引用成員的格式如下:using 名字空間名字空間:名字名字/直接使用成員名字直接使用成員名字(4)使用別名法)使用別名法聲明引用成員的格式如下:聲明

25、引用成員的格式如下:namespace 別名別名=名字空間;名字空間;/使用使用“別名別名:成員名字成員名字”本方法與直接方法成員方法類似,只是加了一個(gè)別名。例如有以下兩本方法與直接方法成員方法類似,只是加了一個(gè)別名。例如有以下兩個(gè)名字空間個(gè)名字空間nsa和和nsb,分別聲明了同名的類模板:,分別聲明了同名的類模板:namespace nsa template class array private: t *ia; int ssize; ;以上的類以上的類array被封裝在名字空間被封裝在名字空間nsa中,在使該類前,中,在使該類前,必須使必須使nsa名字空間可見(jiàn)。名字空間可見(jiàn)。namespa

26、ce nsb template class array private: t *ia; int ssize; ;以上的類以上的類array被封裝在名字空間被封裝在名字空間nsb中,在使該類前,必須使中,在使該類前,必須使nsb名字空間可見(jiàn)。因?yàn)槭褂昧嗣挚臻g,兩個(gè)名字空間可見(jiàn)。因?yàn)槭褂昧嗣挚臻g,兩個(gè)array類分別在不同的名類分別在不同的名字空間中,所以不會(huì)存在沖突。其中四種使用方式如下:字空間中,所以不會(huì)存在沖突。其中四種使用方式如下:第一種用法:直接用法。第一種用法:直接用法。nsa:array a;nsb:array b;第二種用法:指定名字空間。第二種用法:指定名字空間。using

27、namespace nsa;array a;using namespace nsb;array b;第三種用法:聲明引用成員。第三種用法:聲明引用成員。using nsa:array;array a;using nsb:array; /錯(cuò)誤,存在同名的成員錯(cuò)誤,存在同名的成員array b;值得注意的是,上述語(yǔ)句是錯(cuò)誤的,應(yīng)將兩個(gè)類模板改為不同的名字值得注意的是,上述語(yǔ)句是錯(cuò)誤的,應(yīng)將兩個(gè)類模板改為不同的名字,如將,如將nsb中的中的array改為改為array1,則以下語(yǔ)句是正確的:則以下語(yǔ)句是正確的:using nsa:array;array a;using nsb:array1;arra

28、y b;第四種用法:使用別名法。第四種用法:使用別名法。namespace us=nsa;namespace ms=nsb;us:array a;ms:array b;示例:示例:#include namespace ns1int x=10; namespace ns2int x=20; void main()using ns1:x;coutx=xendl;using ns2:x;coutx=xendl;2、使用作用域運(yùn)算符、使用作用域運(yùn)算符“:”訪問(wèn)成員訪問(wèn)成員當(dāng)名字空間的成員和程序的全局標(biāo)識(shí)符同名時(shí),可以通當(dāng)名字空間的成員和程序的全局標(biāo)識(shí)符同名時(shí),可以通過(guò)作用域運(yùn)算符過(guò)作用域運(yùn)算符“:”既

29、定程序的全局標(biāo)識(shí)符;當(dāng)名字空既定程序的全局標(biāo)識(shí)符;當(dāng)名字空間的成員和程序的標(biāo)識(shí)符同名時(shí),首先訪問(wèn)的是程序的間的成員和程序的標(biāo)識(shí)符同名時(shí),首先訪問(wèn)的是程序的局部標(biāo)識(shí)符。局部標(biāo)識(shí)符。示例:示例:#include int x=20; /全局變量全局變量namespace ns1int x=10;void main()using namespace ns1;coutx=:xendl;3、名字空間的嵌套、名字空間的嵌套名字空間也可以像類那樣嵌套,形成多個(gè)層次的作用域名字空間也可以像類那樣嵌套,形成多個(gè)層次的作用域,因此,在訪問(wèn)名字空間的成員時(shí),就有可能使用多個(gè),因此,在訪問(wèn)名字空間的成員時(shí),就有可能使用

30、多個(gè)域運(yùn)算符。域運(yùn)算符。示例:示例:#include namespace ns1 /ns1的初始定義的初始定義int x=10;void fun1()coutns1s fun1()endl;namespace ns2int y=20;void fun2()coutns2s fun2()endl;using ns1:fun1; /using說(shuō)明,全局名字空間限定說(shuō)明,全局名字空間限定fun1using ns1:x; /using說(shuō)明,全局名字空間限定說(shuō)明,全局名字空間限定xusing ns1:ns2:fun2; /using說(shuō)明,多重名字空間限定說(shuō)明,多重名字空間限定fun2using ns1:

31、ns2:y; /using說(shuō)明,多重名字空間限定說(shuō)明,多重名字空間限定yvoid main()fun1();fun2();coutx=xendl;couty=yendl;4、 std名字空間名字空間本章前面的程序都是使用標(biāo)準(zhǔn)本章前面的程序都是使用標(biāo)準(zhǔn)c+編寫的,其頭文件都編寫的,其頭文件都帶有帶有.h擴(kuò)展名,而擴(kuò)展名,而ansi/iso標(biāo)準(zhǔn)標(biāo)準(zhǔn)c+頭文件不帶擴(kuò)展頭文件不帶擴(kuò)展名。這是因?yàn)槊?。這是因?yàn)閏+是從是從c發(fā)展而來(lái),某些頭文件,如發(fā)展而來(lái),某些頭文件,如math.h都是從都是從c中沿襲過(guò)來(lái)的,而諸如中沿襲過(guò)來(lái)的,而諸如iostream.h、iostreamip.h和和fstream.h等是特別為等是特別為c+設(shè)計(jì)的。當(dāng)設(shè)計(jì)的。當(dāng)一個(gè)頭文件被包含進(jìn)某一個(gè)程序中,頭文件中的全局標(biāo)一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論