C++ Primer(第4版)-學習筆記-第5部分:高級主題

第17章   用於大型程序的工具
  1. 異常處理
    不存在數組或函數類型的異常。相反,若是拋出一個數組,被拋出的對象轉換爲指向數組首元素的指針,相似地,若是拋出一個函數,函數被轉換爲指向該函數的指針。

  2. 不要拋出指針

  3. 析構函數不要拋出異常

  4. 除下面幾種可能的區別以外,異常的類型與 catch 說明符的類型必須徹底匹配: 
    •     容許從非 const 到 const 的轉換。也就是說,非 const 對象的 throw 能夠與指定接受 const 引用的 catch 匹配。
    •     容許從派生類型型到基類類型的轉換。
    •     將數組轉換爲指向數組類型的指針,將函數轉換爲指向函數類型的適當指針。


  5. 命名空間
    命名空間爲防止名字衝突提供了更加可控的機制,命名空間可以劃分全局命名空間,這樣使用獨立開發的庫就更加容易了。
    一個命名空間是一個做用域,經過在命名空間內部定義庫中的名字,庫的做者(以及用戶)能夠避免全局名字固有的限制。

  6. 命名空間的定義:
    namespace cplusplus_primer
    {
             class Sales_item { /* ... */};
             Sales_item operator+(const Sales_item&,  const Sales_item&);
             class Query  { /* ... */}; 
             class Query_base { /* ... */};
    }
    命名空間的名字在定義該命名空間的做用域中必須是惟一的。
    命名空間能夠在全局做用域或其餘做用域內部定義,但不能在函數或類內部定義。
    命名空間名字後面接着由花括號括住的一塊聲明和定義,能夠在命名空間中放入能夠出如今全局做用域的任意聲明:類、變量(以及它們的初始化)、函數(以及它們的定義)、模板以及其餘命名空間。
    命名空間做用域不能以分號結束。
    由於不一樣命名空間引入不一樣做用域,因此不一樣命名空間能夠具備同名成員。
    在命名空間中定義的名字能夠被命名空間中的其餘成員直接使用,命名空間外部的代碼必須指出名字定義在哪一個命名空間中。

  7. 從命名空間外部使用命名空間成員
    (1)老是使用限定名
         namespace_name::member_name 
    (2)編寫 using 聲明來得到對咱們知道將常用的名字的直接訪問:
         using cplusplus_primer::Query; 
    在這個 using 聲明以後,程序能夠無須 cplusplus_primer 限定符而直接使用名字 Query

  8. 命名空間能夠是不連續的
    命名空間能夠在幾個部分中定義。命名空間由它的分離定義部分的總和構成,命名空間是累積的。一個命名空間的分離部分能夠分散在多個文件中,在不一樣文本文件中的命名空間定義也是累積的。

  9. 接口和實現的分離
    能夠用與管理本身的類和函數定義相同的方法來組織命名空間:
    (1) 定義類的命名空間成員,以及做爲類接口的一部分的函數聲明與對象聲明,能夠放在頭文件中,使用命名空間成員的文件能夠包含這些頭文件。
    (2) 命名空間成員的定義能夠放在單獨的源文件中。

  10. 全局命名空間
    定義在全局做用域的名字(在任意類、函數或命名空間外部聲明的名字)是定義在全局命名空間中的。
    由於全局命名空間是隱含的,它沒有名字,因此記號  ::member_name 引用全局命名空間的成員。

  11. 嵌套命名空間
    一個嵌套命名空間便是一個嵌套做用域——其做用域嵌套在包含它的命名空間內部。
    嵌套命名空間中的名字遵循常規規則:外圍命名空間中聲明的名字被嵌套命名空間中同一名字的聲明所屏蔽。嵌套命名空間內部定義的名字局部於該命名空間。外圍命名空間以外的代碼只能經過限定名引用嵌套命名空間中的名字。

  12. 嵌套命名空間中成員的名字由外圍命名空間的名字和嵌套命名空間的名字構成。
    例如,嵌套命名空間 QueryLib 中聲明的類的名字是   cplusplus_primer::QueryLib::Query 

  13. 未命名的命名空間
    未命名的命名空間在定義時沒有給定名字。
    未命名的命名空間與其餘命名空間不一樣,未命名的命名空間的定義局部於特定文件,從不跨越多個文本文件。 

  14. 命名空間成員的使用——使用using聲明
    using std::map; 
    一個 using 聲明一次只引入一個命名空間成員,它使得不管程序中使用哪些名字,都可以很是明確。
    using 聲明中引入的名字遵循常規做用域規則。從 using 聲明點開始,直到包含 using 聲明的做用域的末尾,名字都是可見的。外部做用域中定義的同名實體被屏蔽。 

  15. 命名空間別名
    可用命名空間別名將較短的同義詞與命名空間名字相關聯,例如:
    namespace primer = cplusplus_primer;
    一個命名空間能夠有許多別名,全部別名以及原來的命名空間名字均可以互換使用。

  16. using 指示
    using namespace std;
    using 指示以關鍵字 using 開頭,後接關鍵字 namespace,再接命名空間名字。若是該名字不是已經定義的命名空間名字,就會出錯。 
    using 指示使得特定命名空間全部名字可見,沒有限制。短格式名字可從 using 指示點開始使用,直到出現 using 指示的做用域的末尾。

  17. 實參相關的查找與類類型形參
    std::string s;    
    getline(std::cin, s); 
    std::string s;
    它在命名空間 std 中查找並找到由 string 類型定義的 getline 函數。

  18. 重載與命名空間
    兩個不一樣命名空間的成員的函數不能互相重載。
    同一個命名空間能夠包含一組重載函數成員。

  19. 重載與 using 聲明 
    若是命名空間內部的函數是重載的,那麼,該函數名字的 using 聲明聲明瞭全部具備該名字的函數。若是命名空間 NS 中有用於 int 和 double 的函數,則 NS::print 的 using 聲明使得兩個函數都在當前做用域中可見。

  20. 重載與 using 指示
    using 指示將命名空間成員提高到外圍做用域。若是命名空間函數與命名空間所在的做用域中聲明的函數同名,就將命名空間成員加到重載集合中:

  21. 多重繼承
    派生類的構造函數能夠在構造函數初始化式中給零個或多個基類傳遞值:

  22. 構造的次序
    構造函數初始化式只能控制用於初始化基類的值,不能控制基類的構造次序。
    基類構造函數按照基類在類派生列表中的出現次序調用。

  23. 轉換與多個基類
    在單個基類狀況下,派生類的指針或引用能夠自動轉換爲基類的指針或引用,對於多重繼承也是如此,派生類的指針或引用能夠轉換爲其任意基類的指針或引用。

  24. 多個基類可能致使二義性
    能夠經過指定使用哪一個類解決二義性:ying_yang.Endangered::print(cout);
    避免潛在二義性最好的方法是,在解決二義性的派生類中定義函數的一個版本。

  25. 虛繼承
    虛繼承是一種機制,類經過虛繼承指出它但願共享其虛基類的狀態。在虛繼承下,對給定虛基類,不管該類在派生層次中做爲虛基類出現多少次,只繼承一個共享的基類子對象。共享的基類子對象稱爲虛基類。 

  26.  特殊的初始化
    從具備虛基類的類繼承的類對初始化進行特殊處理。在虛派生中,由最低層派生類的構造函數初始化虛基類,並且是先構造虛基類,而後構造非虛基類。
    任何直接或間接繼承虛基類的類通常也必須爲該基類提供本身的初始化式。
 
第18章 用於大型程序的工具
  1. C++ 提供下面兩種方法分配和釋放未構造的原始內存
    (1)  allocator 類,它提供可感知類型的內存分配。這個類支持一個抽象接口,以分配內存並隨後使用該內存保存對象。
    (2)  標準庫中的 operator new 和 operator delete,它們分配和釋放須要大小的原始的、未類型化的內存。 

  2.  allocator 類
相關文章
相關標籤/搜索