這部分涵蓋了一些進階主題,主要包括:異常處理、命名空間和多重繼承以及特殊工具與技術。
17、用於大型程式的工具
C++語言套件含的一些特徵在問題比較複雜、非個人所能管理時最為有用。本章的主題就是這些特徵,即異常處理、命名空間和多重繼承。
一、異常處理
使用異常處理,程式中獨立開發的各部分能夠就程式執行期間出現的問題相互連信,並處理這些問題,程式的一個部分能夠檢測出本部分無法解決的問題,這個問題檢測部分可以將問題傳遞給準備處理問題的其他部分。
1、通過異常我們能夠將問題檢測和問題的解決分離,這樣程式的問題檢測部分可以不必瞭解如何處理問題。
2、舉例
如果運算元的isbn成員不匹配,Sales_item的加操作符可以拋出一個異常:
Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs)<br />{<br /> if(!lhs.same_isbn(rhs))<br /> throw runtime_error("Data must refer to same ISBN");<br /> Sales_item ret(lhs);<br /> ret+=rhs;<br /> return ret;<br />}
程式中將Sales_item對象相加的那些部分可以使用一個try塊,以便在異常發生時捕獲異常:
Sales_item item1,item2,item3;<br />which(cin>>item1>>item2){<br /> try{<br /> sum=item1+item2;<br /> }catch(const runtime_error &e){<br /> cerr<<e.what()<<" Try again./n"<<endl;<br /> }<br />}
二、命名空間
命名空間為防止名字衝突提供了更加可控的機制,命名空間能夠劃分全域命名空間,這樣使用獨立開發的庫就更加容易了。
1、命名空間的定義:以關鍵字namespace開始,後接命名空間的名字
namespace rocket{<br /> class Sales_item{};<br /> class Query{};<br />}
2、每個命名空間是一個範圍,定義在命名空間中的實體稱為命名空間成員,在命名空間中定義的名字可以被命名空間中的其他成員直接存取,命名空間外部的代碼必須指出名字定義在哪個命名空間中:
rocket.Query q=rocket.Query("Hello");</p><p>//如果另一個命名空間也提供Query類,可以修改代碼如下:<br />jamy.Query q=jamy.Query("Hello");
3、可以利用using聲明來從命名空間外部使用命名空間成員
using rocket::Query;</p><p>Query q=new Query("Hello");//rocket::Query類
4、命名空間可以是不連續的:與其他範圍不同,命名空間可以在幾個部分中定義,命名空間由它的分離定義部分的綜合構成,命名空間是累積的。
5、嵌套命名空間
//定義方式<br />namespace rocket{<br /> namespace QueryLib{<br /> class Query{/* ... */};<br /> }<br />}</p><p>//調用方式<br />rocket::QueryLib::Query q=rocket::QueryLib::Query("Hello");
6、未命名的命名空間
命名空間可以是未命名的,未命名的命名空間在定義時沒有給定名字。未命名的命名空間以關鍵字namespace開頭,接在關鍵字namespace後面的是由花括弧定界的聲明塊。
未命名的命名空間中定義的名字可以在定義該命名空間所在的範圍中找到,如果在檔案最外層範圍中定義未命名的命名空間 ,那麼,未命名的命名空間中的名字必須與全域範圍中定義的名字不同:
int i;//全域範圍變數<br />namespace{<br /> int i;//未命名的命名空間內變數<br />}<br />i=10;//Error:不明確定義
三、多重繼承
多重繼承是從多於一個直接基類衍生類別的能力,多重繼承的衍生類別繼承其所有父類的屬性。
1、定義多個類
class Bear : public ZooAnima{<br />};<br />class Panda : public Bear,public Endangered{</p><p>};<br />//基類初始化的次序是:ZooAnimal,Bear,Endangered,Panda<br />//析構的次序是:~Panda,~Endangered,~Bear,~ZooAnimal
四、虛繼承
虛繼承是一種機制,類通過虛繼承指出它希望共用其虛基類的狀態,在虛繼承下,對給定虛基類,無論該類在派生層次中作為虛基類出現多少次,只繼承一個共用的基類子物件,共用的基類子物件稱為虛基類。
1、舉例:istream和ostream類對它們的基類進行虛繼承,通過使基類稱為虛基類,istream和ostream指定,如果其他類同時繼承它們兩個,則衍生類別中只出現它們的公用基類的一個副本。通過在衍生的資料行表中包含關鍵字virtual設定虛基類。
class istream : public virtual ios{/* ... */};<br />class ostream : public virtual ios{/* ... */};</p><p>class iostream : public istream,public ostream{ ... };
2、無論虛基類出現在繼承層次中任何地方,總是在構造非虛基類之前構造虛基類:
例如下面的繼承層次,建構函式調用的次序為:ZooAnimal(),ToyAnimal(),Character(),BookCharacter(),Bear(),TeddyBear().
class Character{};<br />class BookCharacter : public Character {};<br />class ToyAnima {};<br />class TeddyBear : public BookCharacter,public Bear,public virtual ToyAnimal {};