Download presentation
Presentation is loading. Please wait.
1
第 18 章 名稱空間與例外處理 18-1 名稱空間 18-1 名稱空間 18-2 例外處理 18-2 例外處理
2
18-1 名稱空間 18-1-1 什麼是名稱空間 18-1-1 什麼是名稱空間 18-1-2 建立名稱空間 18-1-2 建立名稱空間 18-1-3 使用名稱空間 18-1-3 使用名稱空間 18-1-4 名稱空間的別名 18-1-4 名稱空間的別名 18-1-5 巢狀名稱空間 18-1-5 巢狀名稱空間
3
18-1-1 什麼是名稱空間 - 觀念 名稱空間的觀念其實很簡單,其原意是替本文內 容指定一個有意義的識別符號,例如:作者陳會 安是 X 公司的員工,員工編號 ID 是 1234 ,江小魚 是 Y 公司的員工,員工編號 ID 也是 1234 ,我們可 以使用相同的員工編號 ID 來識別陳會安和江小魚, 因為他們屬於不同的公司, X 和 Y 公司就是名稱空 間的識別符號。 名稱空間的觀念其實很簡單,其原意是替本文內 容指定一個有意義的識別符號,例如:作者陳會 安是 X 公司的員工,員工編號 ID 是 1234 ,江小魚 是 Y 公司的員工,員工編號 ID 也是 1234 ,我們可 以使用相同的員工編號 ID 來識別陳會安和江小魚, 因為他們屬於不同的公司, X 和 Y 公司就是名稱空 間的識別符號。 現在回到計算機科學的程式語言,對於一些簡單 的程式語言來說,只擁有一個名稱空間,所以程 式中的所有函數和變數名稱都不能同名。有一些 程式語言預設擁有多個固定的名稱空間,所以函 數和變數允許同名,因為它們分別屬於不同的名 稱空間。 現在回到計算機科學的程式語言,對於一些簡單 的程式語言來說,只擁有一個名稱空間,所以程 式中的所有函數和變數名稱都不能同名。有一些 程式語言預設擁有多個固定的名稱空間,所以函 數和變數允許同名,因為它們分別屬於不同的名 稱空間。
4
18-1-1 什麼是名稱空間 -C++ 標準函 式庫的名稱空間 std 在 ANSI-C++ 的標準 C++ 函式庫是使用名 稱空間來控制程式範圍, ANSI-C++ 標準 函式庫定義的所有類別、物件和函數,都 屬於名為 std 的標準名稱空間,例如: cout 、 cin 和 string 等類別。 在 ANSI-C++ 的標準 C++ 函式庫是使用名 稱空間來控制程式範圍, ANSI-C++ 標準 函式庫定義的所有類別、物件和函數,都 屬於名為 std 的標準名稱空間,例如: cout 、 cin 和 string 等類別。
5
18-1-2 建立名稱空間 - 說明 名稱空間( Namespaces )可以結合變數、 函數和類別來成為群組,其宣告語法如下 所示: 名稱空間( Namespaces )可以結合變數、 函數和類別來成為群組,其宣告語法如下 所示: namespace 名稱空間的識別字 { ……} 上述名稱空間是使用 namespace 關鍵字開 始,之後是名稱空間的識別字,大括號括 起的是屬於此名稱空間的變數、函數和類 別。 上述名稱空間是使用 namespace 關鍵字開 始,之後是名稱空間的識別字,大括號括 起的是屬於此名稱空間的變數、函數和類 別。
6
18-1-2 建立名稱空間 - 建立名稱空間 在 C++ 語言的名稱空間是定義在一個程式區塊之 中,例如:建立名為 first 的名稱空間,如下所示: 在 C++ 語言的名稱空間是定義在一個程式區塊之 中,例如:建立名為 first 的名稱空間,如下所示: namespace first { int a, b; int a, b; int sum(int a, int b) { return a+b; } int sum(int a, int b) { return a+b; } class Result { class Result { int sum; int sum; public: public: Result(int s) { sum = s; } Result(int s) { sum = s; } int value() { return sum; } int value() { return sum; } }; };}
7
18-1-2 建立名稱空間 - 存取名稱空間 當我們在名稱空間宣告的程式區塊外,存 取變數 a 、 b 、類別 Result 和函數 sum() 時, 程式需要使用名稱空間字首和「 :: 」範圍運 算子來存取,如下所示: 當我們在名稱空間宣告的程式區塊外,存 取變數 a 、 b 、類別 Result 和函數 sum() 時, 程式需要使用名稱空間字首和「 :: 」範圍運 算子來存取,如下所示: first::Result fr(22); first::a = 12; first::b = 15; total1 = first::sum(first::a, first::b);
8
18-1-3 使用名稱空間 - 說明 名稱空間包含變數、函數和類別,當在名 稱空間程式區塊外存取時,我們可以使用 二種方式來存取名稱空間,如下所示: 名稱空間包含變數、函數和類別,當在名 稱空間程式區塊外存取時,我們可以使用 二種方式來存取名稱空間,如下所示: 名稱空間字首的明確存取:使用名稱空間名稱 的字首和「 :: 」範圍運算子來存取,在第 18- 1-2 節的程式範例是使用此方式。 名稱空間字首的明確存取:使用名稱空間名稱 的字首和「 :: 」範圍運算子來存取,在第 18- 1-2 節的程式範例是使用此方式。 使用 using 指引指令來存取:使用 using 指引指 令來存取名稱空間,在本節的程式範例就是使 用此方式來存取名稱空間。 使用 using 指引指令來存取:使用 using 指引指 令來存取名稱空間,在本節的程式範例就是使 用此方式來存取名稱空間。
9
18-1-3 使用名稱空間 -using namespace 指引指令 using namespace 指引指令可以簡化 C++ 程式 碼來存取名稱空間,其基本語法如下所示: using namespace 指引指令可以簡化 C++ 程式 碼來存取名稱空間,其基本語法如下所示: using namespace 名稱空間的識別字 ; 程式區塊可以直接存取的名稱空間,例如:在程 式區塊的開頭使用 using 宣告使用 second 名稱空 間,如下所示: 程式區塊可以直接存取的名稱空間,例如:在程 式區塊的開頭使用 using 宣告使用 second 名稱空 間,如下所示: using namespace second; 程式碼宣告在目前的程式區塊,可以直接存取 second 名稱空間,所以存取變數 a 和 b 時,就不 需要使用字首 second:: ,如下所示: 程式碼宣告在目前的程式區塊,可以直接存取 second 名稱空間,所以存取變數 a 和 b 時,就不 需要使用字首 second:: ,如下所示: a = 12.34; b = 34.56;
10
18-1-3 使用名稱空間 -using 宣告 在 C++ 程式使用 using namespace 指引指令, 表示程式碼可以直接存取整個名稱空間的內容。 在 C++ 程式使用 using namespace 指引指令, 表示程式碼可以直接存取整個名稱空間的內容。 如果名稱空間包含的變數、函數和類別很多,我 們只打算直接存取其部分成員,此時 using 宣告 就可以指定存取的部分成員,如下所示: 如果名稱空間包含的變數、函數和類別很多,我 們只打算直接存取其部分成員,此時 using 宣告 就可以指定存取的部分成員,如下所示: using second::a; 上述程式碼宣告只直接存取 second 名稱空間的變 數 a ,所以可以直接存取 a 變數,如下所示: 上述程式碼宣告只直接存取 second 名稱空間的變 數 a ,所以可以直接存取 a 變數,如下所示: a = 100;
11
18-1-4 名稱空間的別名 對於 C++ 語言已經存在的名稱空間,我們 可以定義其別名,其基本語法如下所示: 對於 C++ 語言已經存在的名稱空間,我們 可以定義其別名,其基本語法如下所示: namespace 新名稱 = 原名稱空間的識別字 ; 上述語法可以指定目前存在名稱空間的新 名稱,例如:替名稱空間 first 指定一個新 名稱 second ,如下所示: 上述語法可以指定目前存在名稱空間的新 名稱,例如:替名稱空間 first 指定一個新 名稱 second ,如下所示: namespace second = first; 上述程式碼宣告名稱空間 first 的新名稱 second 。 上述程式碼宣告名稱空間 first 的新名稱 second 。
12
18-1-5 巢狀名稱空間 在 C++ 的名稱空間可以擁有其他名稱空間,例如: first 名稱空間之中擁有 second 名稱空間,如下所 示: 在 C++ 的名稱空間可以擁有其他名稱空間,例如: first 名稱空間之中擁有 second 名稱空間,如下所 示: namespace first { int a, b; int a, b; namespace second { namespace second { int a, b; int a, b; }} 存取內層名稱空間的變數 a 和 b ,如下所示: 存取內層名稱空間的變數 a 和 b ,如下所示: first::second::a = 56; first::second::b = 78;
13
18-2 例外處理 18-2-1 例外處理的基礎 18-2-1 例外處理的基礎 18-2-2 例外處理的程式敘述 18-2-2 例外處理的程式敘述 18-2-3 同時處理多種例外 18-2-3 同時處理多種例外 18-2-4 自訂類別型態的例外 18-2-4 自訂類別型態的例外
14
18-2-1 例外處理的基礎 - 說明 C++ 語言的「例外」( Exception )是指 在程式執行時,發生不正常執行的狀態。 「例外處理」( Handling Exceptions ) 就是用來處理程式產生的例外。 C++ 語言的「例外」( Exception )是指 在程式執行時,發生不正常執行的狀態。 「例外處理」( Handling Exceptions ) 就是用來處理程式產生的例外。 例外處理的目的是為了讓程式能夠更加 「強壯」( Robust ),就算程式遇到不尋 常情況,也不會造成程式「崩潰」 ( Crashing ),甚至導致整個系統當機。 例外處理的目的是為了讓程式能夠更加 「強壯」( Robust ),就算程式遇到不尋 常情況,也不會造成程式「崩潰」 ( Crashing ),甚至導致整個系統當機。
15
18-2-1 例外處理的基礎 - 例外處理的 架構 C++ 語言的例外處理架構是一種你丟我撿的架構, 當 C++ 程式有不尋常情況產生例外時,程式就開 始尋找是否有例外處理可以進行處理,如下圖所 示: C++ 語言的例外處理架構是一種你丟我撿的架構, 當 C++ 程式有不尋常情況產生例外時,程式就開 始尋找是否有例外處理可以進行處理,如下圖所 示:
16
18-2-1 例外處理的基礎 - 例外處理的 架構說明 在執行過程可能產生兩種型態的例外,如下: 在執行過程可能產生兩種型態的例外,如下: 函數 c() 丟出字元陣列型態的例外:程式執行過 程倒過來找尋是否有指定型態的例外處理,首 先是函數 c() 和 b() ,因為沒有對應的例外處理, 所以最後傳遞給函數 a() ,在此函數擁有可以處 理字元陣列型態的例外處理,可以處理此例外。 函數 c() 丟出字元陣列型態的例外:程式執行過 程倒過來找尋是否有指定型態的例外處理,首 先是函數 c() 和 b() ,因為沒有對應的例外處理, 所以最後傳遞給函數 a() ,在此函數擁有可以處 理字元陣列型態的例外處理,可以處理此例外。 函數 b() 丟出整數型態的例外:同樣需要找尋是 否有例外處理可以進行處理,以此例雖然函數 b() 擁有例外處理,但是因為例外型態不同,所 以,直到 main() 主程式才找到正確的例外處理。 函數 b() 丟出整數型態的例外:同樣需要找尋是 否有例外處理可以進行處理,以此例雖然函數 b() 擁有例外處理,但是因為例外型態不同,所 以,直到 main() 主程式才找到正確的例外處理。
17
18-2-1 例外處理的基礎 -C++ 的標準 例外類別 在 C++ 標準函式庫的函數有可能丟出標準例外類 別( Standard Exception Classes )型態的例 外,這些例外型態都屬於 exception 類別的子類 別。 exception 類別架構如下圖所示: 在 C++ 標準函式庫的函數有可能丟出標準例外類 別( Standard Exception Classes )型態的例 外,這些例外型態都屬於 exception 類別的子類 別。 exception 類別架構如下圖所示:
18
18-2-1 例外處理的基礎 -C++ 的標準 例外類別說明 C++ 語言標準例外類別的說明,如下表所示: C++ 語言標準例外類別的說明,如下表所示:
19
18-2-2 例外處理的程式敘述 - 架構 例外處理程式敘述分為 try 和 catch 二個程式區塊, 可以建立 C++ 程式的例外處理,其基本語法如下 所示: 例外處理程式敘述分為 try 和 catch 二個程式區塊, 可以建立 C++ 程式的例外處理,其基本語法如下 所示: try { ………} catch ( ExceptionType parameterName ) { ……… ……… // 例外處理 // 例外處理 ……… ………}
20
18-2-2 例外處理的程式敘述 - 架構說 明 try 程式區塊:在 try 程式區塊的程式碼是用 來檢查是否丟出例外,當例外產生時,就 會丟出指定型態的例外。 try 程式區塊:在 try 程式區塊的程式碼是用 來檢查是否丟出例外,當例外產生時,就 會丟出指定型態的例外。 catch 程式區塊:當 try 程式區塊的程式碼 丟出例外,程式需要準備一到多個 catch 程 式區塊來處理不同 ExceptionType 資料型 態參數 parameterName 的例外。 catch 程式區塊:當 try 程式區塊的程式碼 丟出例外,程式需要準備一到多個 catch 程 式區塊來處理不同 ExceptionType 資料型 態參數 parameterName 的例外。
21
18-2-2 例外處理的程式敘述 - 範例 例如:處理 int 資料型態的例外處理程式敘述,如 下所示: 例如:處理 int 資料型態的例外處理程式敘述,如 下所示: try { // 檢查是否產生例外的程式碼 // 檢查是否產生例外的程式碼} catch ( int e ) { cout << " 主程式處理例外 : " << e << endl; cout << " 主程式處理例外 : " << e << endl;} 上述程式碼的 catch 程式區塊傳入的是 int 整數資 料型態,可以處理 int 資料型態的例外。 上述程式碼的 catch 程式區塊傳入的是 int 整數資 料型態,可以處理 int 資料型態的例外。
22
18-2-2 例外處理的程式敘述 - 使用 throw 關鍵字丟出例外 在 C++ 程式可以使用 throw 關鍵字丟出例外,其 基本語法如下所示: 在 C++ 程式可以使用 throw 關鍵字丟出例外,其 基本語法如下所示: throw exception; throw 關鍵字必須在 try 程式區塊中執行,或是從 try 程式區塊所呼叫的函數中執行。 throw 關鍵字 類似 return ,可以丟出指定資料型態的例外。例 如:丟出 int 整數資料型態的例外,如下所示: throw 關鍵字必須在 try 程式區塊中執行,或是從 try 程式區塊所呼叫的函數中執行。 throw 關鍵字 類似 return ,可以丟出指定資料型態的例外。例 如:丟出 int 整數資料型態的例外,如下所示: throw value; value 變數是 int 整數資料型態,表示丟出 int 資料 型態的例外,換句話說, C++ 程式需要使用相同 資料型態的 catch 程式區塊來進行例外處理。 value 變數是 int 整數資料型態,表示丟出 int 資料 型態的例外,換句話說, C++ 程式需要使用相同 資料型態的 catch 程式區塊來進行例外處理。
23
18-2-3 同時處理多種例外 在 C++ 程式的 try 和 catch 程式敘述,可以使用多個 catch 程式區塊來同時處理多種不同型態的例外,如下所示: 在 C++ 程式的 try 和 catch 程式敘述,可以使用多個 catch 程式區塊來同時處理多種不同型態的例外,如下所示: try { ……… ………} catch ( const exception& e ) { cout << " 產生例外 : " << e.what() << endl; cout << " 產生例外 : " << e.what() << endl;} catch ( int i ) { cout << " 產生例外 : " << i << endl; cout << " 產生例外 : " << i << endl;} catch (... ) { cout << " 產生未知的例外....." << endl; cout << " 產生未知的例外....." << endl;}
24
18-2-4 自訂類別型態的例外 - 建立 myException 類別宣告如下所示: myException 類別宣告如下所示: class myException { private: char error_msg[80]; char error_msg[80]; int error; int error;public: myException() { *error_msg = 0; error = 0; } myException() { *error_msg = 0; error = 0; } myException(char *s, int e) { myException(char *s, int e) { strcpy(error_msg, s); strcpy(error_msg, s); error = e; error = e; } const char* str_what() { return error_msg; } const char* str_what() { return error_msg; } const int what() { return error; } const int what() { return error; }};
25
18-2-4 自訂類別型態的例外 - 丟出 在使用 throw 關鍵字丟出例外時,就是建立 myException 物件,如下所示: 在使用 throw 關鍵字丟出例外時,就是建立 myException 物件,如下所示: throw myException(" 不是正整數 ", value); 上述程式碼建立 myException 物件,參數 是前述類別宣告的建構子參數。 上述程式碼建立 myException 物件,參數 是前述類別宣告的建構子參數。
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.