C++ 入門指南 V2.00 - 單元 1 - 認識 C++ 語言




使用 C++ 語言寫程式,最簡單的方式就是開啟文字編輯器 (text editor) ,然後將原始程式碼逐字元一個一個打進文字編輯器中,然後依純文字檔案的編碼儲存檔案, C++ 程式的原始碼檔案採用 .cpp 的副檔名



以下是用 Mac 系統的「文字編輯」輸入第一個範例 dmeo.cpp



由於 C++ 編譯器的版本眾多,各種編譯器支援不同的副檔名,因此除了 .cpp 之外,尚有 .cxx.xp.c 等,我們採用 GCC 編譯範例程式,因此副檔名使用常見的 .cpp

也可以利用具有語法高亮度顯示的文字編輯器,或是整合開發環境 (Integrated Development Environment, IDE) ,如下圖為 Mac 系統的 Xcode



自己寫程式用文字編輯器還是 IDE 好呢?只能說青菜、蘿蔔,每個人各有所好。有些 IDE 直接整合編譯器,例如我們在後面「 GUI 篇」要介紹的 Qt Creator ,倒是使用 IDE 還要學一下 IDE 的使用,有點麻煩。我們建議不妨先利用具有語法高亮度的文字編輯器,等學到後面再決定要不要轉換到 IDE 囉!

使用本書的語法高亮度顯示,此範例程式 demo.cpp 如下


001 // 引入標準程式庫中相關的輸入、輸出程式
002 #include <iostream>
003 // 引入標準程式庫中相關的字串程式
004 #include <string>
005
006 // std 為標準程式庫的命名空間
007 using namespace std;
008
009 int main(void) {
010    // 下面建立名稱為 m , string 型態的物件
011    // 小括弧為 string 的建構子
012    // 雙引號為字串字面常數
013    string m("There is no spoon.");
014
015    // cout 用來輸出的物件
016    // endl 為新行符號 '\n'
017    cout << endl;
018    cout << m << endl;
019    cout << endl << endl;
020
021    // 最後回傳 0 給作業系統
022    return 0;
023 }
024
025 /* 檔名: demo.cpp
026    作者: Kaiching Chang
027    時間: 2014-5 */

我們先看到有栗色標記的幾行,先是第 7 行


007 using namespace std;

第 9 行


009 int main(void) {

還有第 22 行


022 return 0;

usingnamespaceintvoidreturn 被稱為關鍵字 (keyword) ,所謂的關鍵字是語法功能的保留字 (reserved word) ,具有既定特殊的用法,例如 usingnamespace 為命名空間的指令, int 為基本內建型態 (primitive built-in type) 中的整數 (integer) , void 被用來宣告 (declare) 空的參數列 (parameter list) 或沒有回傳值 (return value) 。 C++ 共有 86 個關鍵字,我們接下來會介紹各類關鍵字的用法。


另外,第 13 行雙引號圍起來的內容為藍色


013 string m("There is no spoon.");

這是字串字面常數 (string literal) ,所謂的字串就是文字資料,字串內容可以是任何輸入字元。


註解 (comment) 在語法高亮度系統則是綠色,連續兩個斜線為單行的註解,這出現在第 1 行、第 3 行、第 6 行、第 10 到 12 行、第 15 到 16 行及第 21 行,以下為第 1 行的註解


001 // 引入標準程式庫中相關的輸入、輸出程式

斜線、星號開始到另一組星號、斜線結束的範圍則為跨行的註解,這出現在第 25 到 27 行


025 /* 檔名: demo.cpp
026    作者: Kaiching Chang
027    時間: 2014-5 */

所謂的註解就是在程式中輔助說明的文字,凡是註解文字,也就單行連續兩個斜線之後的文字,或是多行斜線、星號範圍間的文字,這些文字都不屬於會被程式執行的部份,因此可用自然語言替程式說明,無須恪守 C++ 的語法規則。


還有一種橄欖色的標記,我們用橄欖色標示標準程式庫 (standard library) 中名稱,像第 2 行


002 #include <iostream>

及第 4 行


004 #include <string>

這是用前置處理器 (preprocessor) 指令 #include 引入程式中所使用的程式庫標頭檔 (header file) 。


程式中來自標準程式庫的名稱也都標為橄欖色,例如第 7 行的 std


007 using namespace std;

第 13 行的 string 定義在 <string>


013 string m("There is no spoon.");

第 17 到 19 行的 coutendl 則定義在 <iostream>


017 cout << endl;
018 cout << m << endl;
019 cout << endl << endl;

這些都是來自標準程式庫的識別字 (identifier) ,另外第 9 行用黑色標記的 main()


009 int main(void) {

以及第 13 行的 m 也是識別字


013 string m("There is no spoon.");

所謂的識別字是我們寫程式自行定義的名稱,如上面的變數 (variable) m ,至於 main() 為函數 (function) 名稱,每個可執行的 C++ 程式都必須有個 main() 函數,關鍵字 void 則表示 main() 不需要參數 (parameter) ,其為空的參數列。


這裡, main() 的小括弧留空也同樣表示空的參數列。

我們將標準程式庫中的識別字以橄欖色標記,而自行定義的識別字與字面常數 (literal) 、運算子 (operator) 都採預設的黑色,做出這樣區別的目的不外是想讓讀者更容易看出哪些識別字是出自標準程式庫囉!


標準程式庫提供許多已經寫好、測試無誤的程式,因此我們寫程式引入標準程式庫,也就是利用前置處理器指令 #include 進來,像是 string 為類別 (class) 名稱, cout 為輸出到標準輸出裝置的物件 (object) , endl 則是新行符號。


<< 是輸出運算子 (output operator) 。

這個範例很簡單,大體上我們可以分成五個區域來看,分別是


  • 引入標準程式庫
  • 宣告使用命名空間
  • 宣告 main() 函數
  • 建立字串物件
  • 於命令列印出訊息

C++ 把輸入與輸出的功能都放到標準程式庫之中,因此使用相關程式需要先引入進來,這需要使用前置處理器指令 #include ,輸入與輸出相關的程式放在 iostream 裡,角括弧 <> 表示這是從標準程式庫中引入的。


同樣的,我們也有用到標準程式庫 string 的程式,因此也要用 #include 引入進來。


由於標準程式庫中的所有名稱都是定義在 std 命名空間 (name space) 之中,如果沒有使用 usingnamespace 的話,程式就得這樣寫


    int main(void) {
       // 下面建立名稱為 m , std::string 型態的物件
       // 小括弧為 string 的建構子
       // 雙引號為字串字面常數
       std::string m("There is no spoon.");
   
       // std::cout 用來輸出的物件
       // std::endl 為新行符號 '\n'
       std::cout << std::endl;
       std::cout << m << std::endl;
       std::cout << std::endl << std::endl;
   
       // 最後回傳 0 給作業系統
       return 0;
    }

:: 是作用域運算子 (scope operator) 。

可執行的 C++ 程式都需要有個 main() 函數,主要因為程式是由作業系統呼叫 main() 來執行的,因此我們自己設計程式時,都得把程式執行的部份放到 main() 當中。若程式檔案少了 main() 函數,這個程式檔案編譯後是無法被執行的。


下面建立一個 string 物件,由於 C++ 是強型態的程式語言,因此變數使用前都要宣告是什麼型態。這裡是用 string 的建構函數 (constructor) 建立 string 物件,然後用字串字面常數當作建構子的參數,初始化 string 字串 m 的內容為 There is no spoon. 。結尾需要用分號,一行分號結尾的程式就是一個陳述 (statement) ,陳述是程式執行的單位, C++ 程式是一行陳述執行完畢,才接著下一行陳述繼續執行。


最後在命令列印出空行,這是利用標準程式庫中的 cout 物件,後面空一格接輸出運算子 << ,最後是空行符號 endl ,最後以分號結束。


接下來兩行陳述亦同,每行陳述的開頭都是 cout ,當然也可以寫在同一行,如下


007 cout << endl << m << endl << endl << endl;

接下來,我們來看看如何編譯與執行吧!


中英文術語對照


文字編輯器 text editor
整合開發環境 Integrated Development Environment, IDE
關鍵字 keyword
保留字 reserved word
基本內建型態 primitive built-in type
整數 integer
宣告 declare
參數列 parameter list
回傳值 return value
字串字面常數 string literal
註解 comment
標準程式庫 standard library
前置處理器 preprocessor
標頭檔 header file
識別字 identifier
變數 variable
函數 function
參數 parameter
字面常數 literal
運算子 operator
類別 class
物件 object
輸出運算子 output operator
命名空間 name space
作用域運算子 scope operator
建構子 constructor
陳述 statement

重點整理


  1. 寫程式可以用文字編輯器或整合開發環境。
  2. C++ 的標準程式庫中有大量開發好、測試無誤的程式,可以直接引入使用。
  3. 字串為雙引號圍起來的文字內容。
  4. 連續兩個斜線為單行註解,一個斜線加一個星號到一個星號到一個斜線則是多行的註解。
  5. 所有可執行的 C++ 程式需要定義 main() 函數。
  6. C++ 是強型態的程式語言,使用變數前需要先宣告,物件用建構函數建立。

問題與討論


  1. 可以用 Word 寫程式嗎?有什麼不方便的地方呢?
  2. 程式語言除了編譯式的 C++ 外,還有直譯式的程式語言,這種程式語言是直接執行儲存程式的純文字檔案,請將直譯式與編譯式的程式語言各舉五種出來。
  3. 想想看應該替程式碼提供哪些註解?什麼地方需要?什麼地方又不需要?
  4. C++ 是物件導向程式語言,除了 C++ 還有其他的嗎? C 語言是嗎? Python 是嗎? Fortran 呢?
  5. 物件是程式設計的中文術語,英文原文為 object ,其實 object 就是一般中文所用「東西」的意思,想一想平常我們是怎麼運用「東西」的,「東西」的概念如何移植到程式設計的物件中?

練習


  1. 將上述範例的內容逐字元打到文字編輯器裡,然後將檔名存成 demo.cpp
  2. 刪除 demo.cpp 中所有單行註解,並將檔名存成 demo2.cpp
  3. 移除 demo2.cpp 中的 using namespace std; ,將檔名存成 demo3.cpp
  4. demo3.cpp 中所有 stringcoutendl 加上前綴 std:: ,把檔名存成 demo4.cpp
  5. demo4.cpp 的輸出部分寫在同一行,把檔名存成 demo5.cpp

the end

1 則留言:

Unknown 提到...
作者已經移除這則留言。