首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Primer Plus 第五版 讀書精華筆記(第 1-16 章)

     編輯:關於C++

第 1 章:C++ 簡介

  • C 語言:面向過程、自上而下分解。C++:面向對象、自下而上設計類別再串聯。
  • C++ 融合 OOP、泛型程式設計、傳統過程式方法。優點:資料保護、程式碼重用、可移植性強。
  • 移植障礙:硬體依賴、語言環境差異。程式建立流程:編碼 → 編譯 → 連結 → 執行。UNIX 下 C 為 .c,C++ 為 .C(大小寫敏感)。

第 2 章:開始學習 C++

  • 大小寫敏感。輸出換行:\n 或 endl。

第 3 章:資料型別

  • OOP 本質:設計並擴充自訂型別,讓型別與資料匹配。
  • 內建型別:基本型別(整數、浮點數)與複合型別(陣列、字串、指標、結構)。
  • 變數命名規則:字母/數字/底線、首字不為數字、大小寫敏感、避開關鍵字、長度無限制(C99 保證前 63 字元)。
  • 整數型別:char、short、int、long 及其 signed/unsigned 共 8 種。<climits> 定義極值常數。sizeof 用於型別需括號,變數可省略。
  • 整數溢位:有號溢位為未定義行為;無號溢位按模環繞。八/十六進位輸出:cout << oct/hex。
  • 字元輸出:cout.put(ch)。轉義字元:\b 退格、\a 響鈴。通用字元名:\u/\U。
  • 符號常數:偏好 const 而非 #define,具型別、作用域限制、支援複雜型別。
  • 浮點數:值與縮放比例分開儲存。標準與科學記號(E)。float、double、long double 依有效位數與指數範圍區分。常數預設 double,f 後綴指定 float。
  • 算術型別自動轉換:不同型別運算、參數傳遞、指派時發生。精度損失情況:double→float、浮點轉整數、大整數轉小整數。

第 4 章:複合型別

  • 陣列大小:整數常數或 const 值/常數運算式。C 風格字串函數在 <cstring>。
  • 友元函數:賦予類外函數類內存取權限。宣告於類內 friend,定義不需 friend。
  • 聯集:節省空間,同一記憶體以不同型別解讀。結構體中嵌入聯集實現變體記錄。
  • 動態記憶體:new 失敗拋出 bad_alloc 或回傳 nullptr(nothrow)。delete 釋放 new 記憶體,delete[] 配對 new[]。delete nullptr 安全。
  • 指標與陣列名差異:指標可增減、為變數;陣列名為常數。sizeof 陣列名得整個大小。arr[i] == *(arr+i)。
  • 字串處理:char*、字串常數均解釋為首字元位址。初始化可用 =,之後需 strcpy/strncpy。
  • 三種儲存期:自動(區域變數)、靜態(全域/靜態區域)、動態(new)。

第 5 章:迴圈與關係運算式

  • 逗號運算子優先級最低:a = 1, 2 等價 (a=1), 2;a = (1, 2) 則 a=2。
  • 字串拼接技巧:std::string 迴圈累加,首項不加分隔符。

第 7 章:函數

  • 函數原型參數名可省略。陣列參數退化為指標,int* arr 與 int arr[] 等價。
  • const 指標:const int* p 不可透過 *p 修改;int* const p 指標本身不可修改。禁止將 const 位址指派給非 const 指標,強制轉換用 const_cast。
  • 盡量使用 const 參數,兼容 const/非 const 實參,防呆。
  • 回呼函數:編寫時不知何時被呼叫,常用於動態庫介面。
  • 內聯函數:inline 建議展開,替代巨集。優點:可除錯、型別檢查、存取類成員、類內定義隱式內聯。遞迴/迴圈不內聯。
  • 參數傳遞選擇:小型物件傳值;陣列用指標(加 const);大型結構用 const 指標/參考;類別物件用 const 參考(語意要求)。
  • 回傳參考:不可回傳區域物件參考。通常回傳參數參考或 new 記憶體(需記得釋放)。
  • 預設參數:由右至左依序宣告。函數多載:參數列表不同。const 屬性可構成多載。

第 9 章:記憶體模型與命名空間

  • 函數定義/變數宣告勿置於標頭檔(內聯函數/類別成員函數除外),否則多重包含導致重複定義。
  • register:建議存入暫存器,不可取址。auto 為預設自動儲存類別(C++11 前)。
  • 跨檔案全域變數:定義於一檔,他檔用 extern 宣告。static 全域變數限定於本檔,隱藏同名外部變數。
  • mutable:突破 const 限制,允許在 const 物件/函數中修改。
  • using 宣告引入單一名稱;using namespace 引入整個空間。

第 10 章:物件與類別

  • 建構子:僅無任何建構子時編譯器提供預設。自訂建構子後必須自行提供預設(全參數預設值或重載無參版本),兩法擇一。隱式呼叫勿加括號(Stock s; 非 Stock s();)。
  • 解構子:無參、不可多載。const 物件只能呼叫 const 成員函數。回傳 const 參數的函數回傳值也應為 const。
  • 物件陣列要求類別有預設建構子。類別常數:enum 或 static const 整數型別可在類內初始化。bool 通常 1 byte,BOOL 為 4 bytes。

第 11 章:運算子多載進階

  • 多載規則:至少一個使用者型別運算元、保持語法/優先順序、不可建立新運算子、特定運算子不可多載。
  • 非成員多載:解決左運算元非類物件問題(如 2.5 * timeObj),需宣告為 friend 存取私有成員。operator<< 回傳 ostream& 支援鏈式輸出。
  • 成員與非成員多載不可同時存在(參數列表相同會產生二義性),須調整參數順序區分。
  • 一元/二元 - 可分別多載。單參數建構子隱式轉換,explicit 禁止。型別轉換函數 operator Type() 無回傳型別/參數。多重轉換函數易產生二義性,謹慎使用隱式轉換。
  • 全域物件:main 前執行建構子,常見於 MFC theApp。

第 12 章:類別動態記憶體分配

  • 動態分配目的:編譯期不知大小,執行期依參數計算精確配置。new 執行期決定大小,陣列編譯期固定。
  • 成員宣告處不可初始化(未配置記憶體)。static const 成員可在宣告初始化。
  • 拷貝建構子:產生物件副本時呼叫。預設淺複製(逐成員複製)。指標成員指向動態記憶體時必須自訂深度複製。成員函數可存取同類別其他物件私有成員。
  • 指派運算子:ClassName& operator=(const ClassName&) 回傳參考支援鏈式指派。只能用成員函數多載。含 new 成員時需自訂深度複製。多個建構子的 new/new[] 方式必須一致(只有一個解構子)。
  • 類別轉換:他型別→類別用建構子;類別→他型別用 operator Type()。const 成員變數與參考成員必須用初始化清單。初始化順序依宣告順序而非清單順序。int a(1); 等價 int a=1;。
  • 禁止複製/預設建構:將拷貝建構子、指派運算子宣告為 private 且不實作。

第 13 章:類別繼承

  • 基底類別無預設建構子時,衍生類別建構子必須在初始化清單呼叫基底建構子。
  • 衍生建構順序:基底物件優先建構 → 初始化清單傳遞基底參數 → 初始化衍生新增成員。初始化清單僅能傳遞給直接基底(虛擬基底除外)。
  • 繼承關係:is-a。虛擬解構子確保 delete 基底指標正確呼叫衍生解構子。重新定義基底方法通常宣告 virtual,配合虛擬解構子。
  • 靜態連結(編譯期:巨集、內聯、非虛擬函數)vs 動態連結(執行期:多態)。向上轉型:衍生指標/參考轉基底,公有繼承隱式進行,可傳遞性。
  • 虛擬函數機制:隱藏成員 vptr 指向虛擬函數表(函數位址陣列)。衍生類別覆寫則更新表項。
  • 虛擬函數限制:內聯/靜態/建構子不可為虛擬。建構子需知實際型別,虛擬表未初始化。解構子設虛擬確保完整銷毀。友元非成員不可虛擬。
  • 名稱隱藏:衍生類別同名函數隱藏基底同名函數(無論參數、是否虛擬)。非虛擬同名同參隱藏而非覆寫。基底多載版本若衍生類別只定義一個,其餘全被隱藏,需在衍生類別全部實作或呼叫基底版本。
  • 保護成員:類外同私有,衍生類別內同公開。單例模式:private 建構子 + static 靜態區域物件 + 公開靜態取得函數。
  • 衍生類別含動態記憶體時,拷貝建構子、指派運算子、解構子皆需呼叫對應基底方法處理基底部分。

第 14 章:程式碼重用(包含與私有繼承)

  • 成員物件未在初始化清單建構則呼叫預設建構子。初始化順序依宣告順序。
  • 私有繼承:基底公開/保護成員在衍生類別變為私有。需用 Base::func() 呼叫基底方法。需存取基底物件本身用強制轉型 (const Base&)*this。優勢:可存取基底保護成員(包含關係無法存取)。
  • using Base::member; 將基底成員提升為衍生類別公開/保護介面。虛擬繼承解決鑽石問題:class B : virtual public A。虛擬基底建構子由最底層衍生類別直接呼叫。同名成員需作用域限定符消除二義性。
  • 類別樣板:型別參數可有預設值 template<class T1, class T2 = int>。函數樣板不可有預設值。具體化機制待補充。

第 15 章:友元、異常與其他

  • 友元類別:所有成員函數均為友元。宣告位置不限存取層級。巢狀類別常用於實作細節與避免名稱衝突。
  • 異常類別:自訂類別攜帶錯誤資訊。函數宣告 throw(ExceptionType) 指定可能拋出型別,空列表表示不拋出,無規格表示任意型別。
  • catch 區塊順序:衍生類別在前,基底類別在後。catch(...) 捕獲所有,置最後。基底類別 catch 會捕獲所有衍生異常。
  • 標準異常體系:std::exception 為基底。自訂異常建議繼承並覆寫 what()。未捕獲異常呼叫 terminate(),可用 set_terminate() 設定處理函數。
  • RTTI:dynamic_cast 安全向下轉型(成功回傳指標/參考,失敗回傳 nullptr/拋出 bad_cast);typeid 回傳 type_info 參考,支援比較與 name();type_info 儲存型別資訊。需類別有虛擬函數。
  • 四種轉型:dynamic_cast(多態安全)、const_cast(移除 const/volatile)、static_cast(相關型別靜態轉換)、reinterpret_cast(危險位元重解讀)。

第 16 章:string 類別與 STL

  • auto_ptr:管理單一 new 物件(不可用於 new[] 或自動變數),C++11 棄用改用 unique_ptr。
  • 基底類別常為抽象類別,具體類別位於繼承鏈末端。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved