程式 (program) 裡需要自行命名的識別字 (identifier) 非常多,例如變數 (variable) 、函數 (function) 、類別 (class) 、成員 (member) 等等
有些名稱是自行定義的,有些名稱則屬於標準程式庫 (standard library) 中已經定義好的,例如 string 、 cout 等。標準程式庫是依 C++ 標準隨編譯器 (compiler) 提供的程式庫 (library) ,提供非常多樣的功能,例如資料結構、處理時間、輸入輸出、圖形介面、網路通訊等,我們在需要時可以引入所需的程式庫,無須自行開發相同或類似的程式。
標準程式庫裡頭的東西都是開發完成、測試無誤的,很多經常使用的程式都無須從頭開發自己的版本,這個好處大大節省了我們開發軟體的時間。
我們自行定義的識別字應避免與標準程式庫中的相同,如果我們定義相同的識別字名稱,雖然可以通過編譯,但容易造成混淆或名稱衝突,因此應避免,例如以下程式
001 | #include <iostream> |
002 | |
003 | using namespace std; |
004 | |
005 | int main(void) { |
006 | // 變數 string 用到跟程式庫相同的識別字 |
007 | char string[] = {'h', 'e', 'l', 'l', 'o'}; |
008 | |
009 | cout << endl; |
010 | cout << string << endl; |
011 | cout << endl << endl; |
012 | |
013 | return 0; |
014 | } |
015 | |
016 | /* 檔名: wrong_name.cpp |
017 | 作者: Kaiching Chang |
018 | 時間: 2014-5 */ |
這個例子中我們用 string 當變數 (variable) 名稱,編譯執行都是沒有問題的
但是當我們要用到標準程式庫中的 string 來宣告變數時,這裡就會產生名稱衝突。簡單說, demo2.cpp 的 main() 已經有 string 當區域變數,之後再用任何 string 都是指已經建立的區域變數 string ,而非標準程式庫中的 string 類別,因而造成標準程式庫中的識別字 string 無法使用。
至於識別字命名是採用英文二十六的大小寫字母為主,另加上數字、底線符號,如下
_ | ||||||
a | b | c | d | e | f | g |
h | i | j | k | l | m | n |
o | p | q | r | s | t | u |
v | w | x | y | z | ||
A | B | C | D | E | F | G |
H | I | J | K | L | M | N |
O | P | Q | R | S | T | U |
V | W | X | Y | Z | ||
0 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 |
基本上變數或識別字的命名習慣以簡單、清楚為原則,常見的就是小寫英文單字
iter | |
total | |
screen | |
rfind |
或是以底線連接的英文單字組合小寫英文單字
exam_score | |
test_result | |
my_file | |
find_first_of |
數字不能當作識別字的開頭,另外建議識別字不要用連續兩個底線命名。
每個英文單字之間也不可以有空格,空格是區別兩個程式中記號 (token) 的符號。
型態 (type) 使用的識別字,例如類別 (class) 、結構 (structure) 、列舉 (enumeration) 等,這些比較常採大寫駝峰型 (upper camel case)
SimpleGame | |
MyStory | |
ThreadTestDrive | |
RunThreads |
函數的命名也是以大寫駝峰型為主,第一個單字通常採動詞
DoSomething() | |
Rotate() | |
LoadRecord() | |
ForgetIt() |
另外簡單的函數,或是類別裡的存取函數 (accessor) 或修改函數 (mutator) ,比較常用英文小寫字母組合
set_number() | |
get_number() | |
is_present() | |
gcd() |
以上舉出一些基本常見的命名習慣,許多也見於標準程式庫中,至於其他第三方程式庫可能有不同的命名習慣,例如我們在 GUI 篇要介紹的 Qt , Qt 在函數的命名習慣部分,偏向小寫駝峰型 (lower camel case)
actionPerformed() | |
setUpNetworking() | |
getField() | |
myField() |
當然仔細來講,標準程式庫跟其他第三方程式庫的命名習慣可能還有很多不同,倒是我們先要掌握基本的命名規則,日後學習其他的程式庫再去熟習命名習慣囉!
程式的每一行都要以分號結尾,若是漏打分號的話,編譯器還會中斷編譯,並且提供警告訊息,因為有分號結尾的程式碼,在 C++ 稱之為陳述 (statement) ,簡單的陳述可由運算式 (expression) 組成,接下來我們開始介紹運算式與陳述囉!
中英文術語對照
程式 | program |
識別字 | identifier |
變數 | variable |
函數 | function |
類別 | class |
成員 | member |
標準程式庫 | standard library |
編譯器 | compiler |
程式庫 | library |
記號 | token |
型態 | type |
結構 | structure |
列舉 | enumeration |
大寫駝峰型 | upper camel case |
存取函數 | accessor |
修改函數 | mutator |
小寫駝峰型 | lower camel case |
陳述 | statement |
運算式 | expression |
重點整理
- 自行命名的識別字應該避免與標準程式庫中相同。
- C++ 接受的命名符號包括底線、大小寫英文字母及數字。
- 識別字多採有意義的英文單字組合,型態、函數名稱多採大寫駝峰型,變數、簡單的函數則用小寫英文字母組合。
- 第三方程式庫如 Qt 的命行習慣,不見得會和標準程式庫中相同。
- 分號為陳述的結尾,漏打分號會產生編譯錯誤。
問題與討論
- 數字為什麼不可以當作識別字的起始字元?
- 為什麼建議識別字中不要用連續兩個底線?
- 為什麼識別字中不可以有空格?
- 為什麼命名變數要用有意義的英文單字?
- 大寫駝峰型跟小寫駝峰型的差別在哪裡?為什麼要有不同的命名習慣?
練習
- 寫一個程式 exercise0501.cpp ,用數字當變數的起始字元,例如 2m ,觀察編譯結果。
- 寫一個程式 exercise0502.cpp ,用底線當變數的名稱,例如 __ ,觀察編譯結果。
- 寫一個程式 exercise0503.cpp ,設計一個 int 變數 apple_num ,然後把 apple_num 中的底線改成空格,觀察編譯結果。
the end
沒有留言:
張貼留言