Stephen Prata:c++ Primer Plus@2005 (第5版)

這份文件來自書籍《C++ Primer Plus》第五版的目錄及前兩章內容,主要闡述了 C++ 語言的起源、程式設計哲學、標準化,以及最基本的程式結構和輸入/輸出操作。以下將針對這些核心要點進行詳盡的解釋:

1. 書籍概覽與學習方法

  • 《C++ Primer Plus》第五版旨在引導讀者學習 C++ 語言,涵蓋了從基礎到進階的各個方面。
  • 本書的設計理念是作為一本易於使用的入門指南,不預設讀者已熟悉所有相關的程式設計概念。
  • 學習方法強調實踐,透過簡短且易於操作的範例程式碼,逐步建立對概念的理解。
  • 書中包含解釋性的插圖以及供讀者測試理解程度的複習問題和程式練習,適合自學或課堂使用。
  • 本書基於 ISO/ANSI C++ 標準,描述了 C++ 語言及其標準函式庫,旨在幫助讀者編寫穩健、高效且可移植的程式。

2. C++ 語言的起源與程式設計哲學

  • C 語言的基礎: C++ 建立在 C 語言之上,繼承了 C 語言高效、緊湊、快速且可移植的傳統。C 語言在 1970 年代由 Dennis Ritchie 為了開發 Unix 作業系統而建立,其設計目標是結合低階語言(如組合語言)的高效率和硬體存取能力,以及高階語言的通用性和可移植性。
  • 程序式程式設計: C 語言是一種程序式語言,強調演算法(程式執行的步驟)。它的程式設計哲學是將問題分解為較小的任務,並使用函數來實現這些任務。結構化程式設計和由上而下的設計方法是這種哲學的體現,旨在提高程式的清晰度、可靠性和可維護性。
  • 物件導向程式設計 (OOP): C++ 加入了對 OOP 的支援,這是一種不同的程式設計範式。OOP 強調資料,嘗試將語言擬合到問題領域中的概念。
    • 類別 (Class): 是 OOP 的核心,用於定義使用者自訂的資料類型。一個類別描述了資料的結構(資料成員)以及可以對這些資料執行的操作(成員函數或方法)。
    • 物件 (Object): 是類別的具體實例,根據類別定義建立的資料結構。
    • OOP 促進了由下而上的設計方法,先設計代表問題領域概念的類別,再使用這些類別來構建程式。
    • OOP 的主要特性包括:
      • 抽象 (Abstraction): 關注資料的介面,隱藏內部實現細節。
      • 封裝 (Encapsulation) 和資料隱藏 (Data Hiding): 將資料和操作資料的方法綁定在一起,並限制外部直接存取資料。
      • 多型 (Polymorphism): 允許同一個名稱(函數名或運算子)在不同情境下執行不同的操作。
      • 繼承 (Inheritance): 允許從現有類別(基底類別)建立新類別(衍生類別),繼承基底類別的特性,促進程式碼重用。
  • 泛型程式設計 (Generic Programming): C++ 也支援泛型程式設計,主要透過範本 (Template) 實現。泛型程式設計旨在編寫與特定資料類型無關的程式碼,使其可以應用於各種不同的資料類型,常用於實現如排序、搜尋等通用演算法。

3. 程式碼的可移植性與標準化

  • 程式的可移植性指程式碼在不同計算機環境(不同處理器、作業系統)下無需修改或只需少量修改即可重新編譯和執行。
  • 為確保 C++ 程式碼的可移植性,需要有一個關於語言工作方式的公開標準。
  • ANSI(美國國家標準協會)和 ISO(國際標準化組織)共同制定了 C++ 標準 (ISO/IEC 14882:2003),該標準定義了語言特性、行為以及標準函式庫(包括 C++ 類別庫和 C 標準函式庫)。
  • 現代編譯器大多符合 ANSI/ISO C++ 標準,這提高了程式碼的可移植性,但也可能存在一些實現差異。

4. 建立 C++ 程式的流程

  • 撰寫原始碼: 使用文字編輯器撰寫 C++ 程式碼,並儲存為原始碼檔案。檔案通常使用 .cpp.cxx.C 等副檔名。
  • 編譯 (Compilation): 使用 C++ 編譯器將原始碼翻譯成計算機可以理解的機器語言程式碼,產生目標碼檔案(通常為 .o.obj 副檔名)。
  • 連結 (Linking): 使用連結器將程式的目標碼與函式庫中的預編譯程式碼(如標準 I/O 函數的程式碼)以及標準啟動程式碼結合,生成可執行的程式檔案。
  • 許多現代 C++ 開發環境提供整合開發環境 (IDE),將編輯、編譯、連結等步驟整合在一起。

5. C++ 程式的基本結構

  • 函數: C++ 程式由一個或多個函數組成。
  • main() 函數: 每個 C++ 程式都必須有一個名為 main() 的函數,程式執行始於 main() 函數的開頭。
  • 函數定義: 函數定義包括函數標頭和函數主體(括號 {} 中的部分)。
  • 函數標頭: int main()main() 函數的標頭。int 表示函數返回一個整數值(通常用於指示程式執行狀態),() 表示函數不接受參數。
  • 函數主體: 包含一系列陳述句,每個陳述句以分號 ; 結束。
  • 陳述句: 是程式中的一個完整指令。常見的陳述句類型包括:
    • 宣告陳述句: 宣告變數的類型和名稱,例如 int carrots;
    • 賦值陳述句: 使用 = 運算子將值賦給變數,例如 carrots = 25;
    • 函數呼叫: 執行另一個函數,例如 simple();cout << "text";
    • 返回陳述句: return 0; 終止函數執行並返回一個值。
  • 註解: 使用 // 符號,從 // 開始到行尾的文字被編譯器忽略。也可以使用 C 風格的 /* ... */ 註解。
  • 預處理指令:# 開頭的指令,在編譯前由預處理器處理。例如 #include <iostream> 指令將 iostream 檔案的內容包含到程式中。
  • 命名空間指令: using namespace std; 指令使 std 命名空間中的名稱(如 coutcinendl)可以直接使用,無需加上 std:: 前綴。這是為了避免不同函式庫中相同名稱的衝突。
  • 輸入/輸出:
    • cout 是標準輸出物件,配合 << 運算子用於向輸出串流(通常是螢幕)寫入資料。
    • endl 是一個操縱器,用於插入換行並刷新輸出緩衝區。\n 字符也有類似作用。
    • cin 是標準輸入物件,配合 >> 運算子用於從輸入串流(通常是鍵盤)讀取資料。cin 會將讀取的字元轉換為變數所需的資料類型。

這些基本要素構成了 C++ 程式的框架,後續章節將在此基礎上介紹更多複雜的語言特性和程式設計技術。