c++primer第十五章友元、異常和其他

一、友元
1、友元
類並非只能擁有友元函數,也可以擁有友元類。友元類的所有方法都可以訪問原始類的所有私有或者保護成員。
(1)友元類:將類作爲友元
(2)友元函數:將類中某個特定的函數作爲另一個類的友元。

class Tv
{
    ....
    friend void Remote::set_num(Tv &,int);
}

//編譯器要處理這條語句,爲了避開循環依賴,必須使用前向聲明。
class Tv;
class Remote{ ... };
class Tv{ ....};

友元函數在原始類中應只聲明,將定義放在實際定義TV類之後。
內聯函數的鏈接性是內部的,意味函數必須定義在使用函數的文件中。

2、其他友元關係
除了通過友元和類的組合形式,還可以讓類彼此成爲對方的友元來實現。

3、共同的友元
函數需要訪問兩個類的私有數據,可以是一個類的成員,同時是另一個類的友元。
但有時函數作爲兩個類的友元更合理。

二、嵌套類
將聲明放在另一個類中,稱爲嵌套類(nested class );
包含類的成員函數,可以創建和使用嵌套類的對象。

1、嵌套與包含的區別:

包含:將類對象作爲另一個類的對象。
嵌套:定義一個新的自定義類型,該類僅在該嵌套類聲明的類中有效。

2、嵌套類的訪問權限。

聲明位置 包含類 嵌套類 類外部(對象)
private ok no no
protected ok ok no
public ok ok ok

三、異常
c++提供的處理運行階段錯誤的強大而靈活的工具。

一般程序異常的結果
1、 程序崩潰調用abort()函數(直接終止程序)
2、某些全局變量(erron)返回錯誤原因。

C++異常處理機制
try(將可能引發異常的代碼放在其中)
throw(拋出異常)
catch(捕獲異常)
異常的類型可以是基本的內置類型,字符串、類對象。
沒有匹配到異常,將直接調用abort()函數。

3、將對象用作異常類型
引發異常的函數傳遞一個對象
(1)可以使用不同的異常類型來區分不同的函數在不同的情況下的異常。
(2)對象可以攜帶異常信息

4、C++11摒棄了異常規範

5、棧解退
問題前提:try塊沒有直接調用引發異常的函數,而是調用了對引發異常的函數進行調用的函數。

在沒有引發異常的情況下,函數調用結束後,使用return返回調用的函數,釋放存放在棧空間的內存,
多層函數調用情況也是如此。
在引發異常的情況下,函數不會返回上一級調用的函數,而是繼續釋放返回的地址,直到在棧空間找到一個 try塊的中的返回地址,將控制權轉到塊尾的異常處理函數中,這就是棧解退。如果沒有棧解退,對於中間的調用函數放在棧中的自動類對象其析構函數函數都不會被調用。

6、其他異常特性
(1)throw語句將程序的控制權返回到能夠捕獲異常的try-catch的結構組合中。
(2)如果有一個異常類繼承的結構,應將類異常的catch放在最下面。
(3)catch(…)能夠捕獲任何異常
(4)new失敗後返回空指針。

7、異常、繼承和嵌套
(1)可以從一個異常類中派生另一個。
(2)可以在中定義嵌套異常類來組合。
(3)這種嵌套類本身可以被繼承,但不可作爲基類。

8、異常的迷失方向
(1)意外異常
(2)未捕獲異常

四、RTTI(運行階段類型識別)
C++支持RTTI的元素,RTTI的只適用於包含虛函數的類,在這種情況下,才應該將派生類的指針賦值給基類指針。

1、dynamic_cast

dynamic_cast<Tyep *>pt;
// 使基類指針轉換爲派生類的指針,通過判別指針的類型,從而確定調用的函數;

2、typeid運行符和type-info的類
typeid使確定兩個對象的是否爲同種類型,接受兩種參數
(1)類名
(2)結果爲對象的表達式

typeid().name()返回類名。

發佈了106 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章