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

C++ Primer 4th 讀書筆記(第一部分):基礎語言特性精要

     編輯:C++ 入門

前言與快速入門

  • 書中大量交叉引用,適合查閱;定位為指南性讀物,假設讀者掌握一種現代結構化語言。
  • main 返回值告知 OS 程序執行狀態;輸入操作符 >> 返回左操作數(流對象),利用其布爾值實現「讀入未知數量輸入」:while (cin >> val) sum += val;

變量與基本類型

類型分類

  • 基本字符類型 char、擴展 wchar_t;整型統稱 integral type(含布爾、字符)。
  • 字面值後綴:L (long), U (unsigned), F (float);科學計數法 1.23e4。
  • 字符串字面值類型為 const char[],編譯器自動添加結束符 '\0'。

初始化 vs 賦值

  • 初始化:創建變量並賦初值(int a = 10; copy-initialization,int a(10); direct-initialization)。
  • 賦值:擦除舊值存入新值。
  • 多參數初始化只能用 direct-initialization(構造函數語法)。

聲明 vs 定義

  • 定義分配存儲,可初始化;聲明僅聲明類型名(extern int i;)。
  • 非 const 全局變量默認 extern;const 全局變量默認內部鏈接(文件局部),需 extern const 實現跨文件共享。
  • const 變量定義時必須初始化(利用「定義唯一」實現不可修改)。

引用

  • 引用是對象別名,必須初始化,綁定後不可改變指向;返回左值,主要用作函數形參。
  • 不能定義引用的引用、引用數組、引用指針(但可定義指向引用的指針?不行)。

typedef 與枚舉

  • typedef 定義類型別名,增強可讀性(如區分不同用途的同一底層類型)。
  • 枚舉 enum 定義唯一類型,成員值可重複;枚舉對象只能用枚舉成員或同類型對象初始化/賦值。

類與結構體

  • class 默認 private,struct 默認 public,其餘相同。

頭文件規範

  • 頭文件不應包含定義(變量、函數體),除三例外:類定義、const 對象(常量表達式初始化)、inline 函數——編譯器需見定義生成代碼。
  • 頭文件保護符 #ifndef/#define/#endif 防止重複包含。

標準庫類型

string

  • string::size_type 為無符號類型,保存 size 最安全;下標也宜用此類型。
  • 字符串字面值(const char*)與 std::string 非同類型。
  • getline 讀整行,cin >> word 讀單詞。

vector

  • 動態增長,push_back、size() 返回 size_type。
  • 迭代器:begin(), end()(指向尾後),解引用 *it;const_iterator 唯讀。
  • 任何改變長度操作會使現有迭代器失效。

bitset

  • 可用 string 初始化,注意讀入順序從右向左(低位在右)。

數組與指針

  • 數組缺點:長度固定、無 size 操作、不可直接拷貝/賦值;優先用 vector/string。
  • 指針聲明從右向左讀:int *p,int *const p(頂層 const),const int *p(底層 const)。
  • void* 通用指針,僅支持比較、傳遞、賦值給 void*。
  • 引用 vs 指針:引用必須綁定對象且不可改綁;賦值修改被綁定對象。指針可空、可改向、解引用修改所指對象。
  • 指針減法結果類型 ptrdiff_t(<cstddef>)。
  • 指向數組指釖可下標訪問:int *p=&ia[2]; p[-2] 合法。
  • 動態數組:new int[10]() 值初始化為 0;delete[] 釋放;長度 0 合法但不可解引用。
  • C 風格字符串:以 '\0' 結束的字符數組,用 const char* 操作;string::c_str() 轉換。
  • 多維數組指針:int (*p)[4] 指向 4 元素數組;typedef int Arr[4]; Arr *p; 簡化。

表達式

  • 運算符優先級、結合性、求值順序:&&, ||, ,, ?: 保證左先右、短路。
  • % 負數結果機器相關;位運算建議用無符號類型。
  • 前置 ++/-- 效率高於後置(前置不需保存舊值)。
  • sizeof 不計算表達式值:sizeof *p 中 p 可為無效指針。
  • 逗號運算符:結果為最右表達式值,常用於 for 多變量更新。
  • 類型轉換:隱式(算術轉換、條件判斷、初始化/賦值、函數調用)與顯式(static_cast 等四種新式 cast,舊式 (type)expr 或 type(expr))。

語句

  • 空語句應加註釋;復合語句(塊)在語法上是單條語句。
  • switch:case 貫穿需註釋;default 表明已考慮該情況;變量定義只能在最後一個 case/default 後或塊內。
  • do-while 必以分號結尾;break 跳出最近循環/switch;continue 結束本次迭代。
  • 異常:throw, try, catch;尋找 handler 順序與調用鏈相反。
  • 調試:NDEBUG 宏控制 assert 及 #ifndef NDEBUG 調試碼;assert 用於檢查「不可能發生」的條件,異常用於預期錯誤。

函數

  • 調用:用實參初始化形參,控制權轉移;主調掛起,被調執行。
  • 形參傳遞:值傳遞(拷貝)、引用傳遞(別名)、指針傳遞。引用更安全自然;const 引用可接受字面值/臨時對象。
  • 數組形參退化為指針;可用引用保留維度:void f(int (&arr)[10])。
  • 多維數組:第一維長度被忽略,void f(int m[][10])。
  • 處理數組邊界三法:哨兵值、首尾指針、顯式傳長度。
  • return:無返回值用 return;;有返回值用 return expr;;勿返回局部對象引用/指針。
  • 函數原型 = 返回類型 + 名字 + 形參列表;默認實參建議在聲明(頭文件)中指定,一個文件只能指定一次。
  • 局部靜態對象:static size_t ctr=0; return ++ctr; 生命周期贯穿程序。
  • 內聯函數:inline 建議編譯器展開,適用於小而頻繁調用的函數;定義放頭文件。
  • 成員函數:隱含 this 指針;const 成員函數 const 放參數表後(Type func() const),意味著 const Type* const this;構造函數初始化列表初始化成員(內置類型必須顯式列出,否則未初始化)。
  • 重載:同作用域、同名、形參表不同;名字查找先於類型檢查;局部聲明會屏蔽外層同名函數(非重載)。匹配優先級:精確匹配 > 類型提升 > 標準轉換 > 類類型轉換;const 僅影響引用/指針形參的重載。
  • 函數指針:bool (*pf)(const string&, const string&);可用 typedef 簡化;調用無需解引用 pf(args);作形參/返回類型時需注意語法;重載函數取地址需上下文確定具體版本。

標準 IO 庫

  • 流類型通過繼承關聯(iostream, fstream, sstream),可編寫通用流操作函數。
  • 流對象不可拷貝/賦值 ⇒ 不能存入容器、不能作值傳遞形參/返回值,必須用引用/指針。

(筆記未完待續,後續章節將覆蓋類設計、模板、泛型算法、標準庫容器等進階主題。)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved