前言
在這篇文章中,我們不寫程式,僅對 C++ 做概念上的介紹。
C++ 的問世
C++ 原先的用意是在保留 C 特性的前提下,加上物件導向程式設計 (object-oriented programming) 的語法。在長年的發展中,C++ 成為同時支援命令式 (imperative)、物件導向式、函數式 (functional)、泛型 (generic) 等多種範式 (paradigms) 的通用型編譯語言。
最早的 C++ 編譯器 cfront 其實是 C++ 轉 C 的程式碼轉譯器 (trans-compiler),但 cfront 發展到例外處理 (exception handling) 時碰到瓶頸,該計畫就中止了。後來的 C++ 編譯器就重新以編譯器 (compiler) 來實作。
什麼是現代 C++?
C++ 在西元 1985 年問世,至今 (西元 2022 年) 已經超過 30 個年頭。對於這樣一個有歷史的語言,為什麼會有現代 C++ (modern C++) 這個詞語呢?
因 C++ 在 C++11 開始,加入許多新的特性,再經過 C++14、C++17、C++20 等數個版本的更迭,已經和原先 C++ 的面貌大不相同。因此,在 C++11 (西元 2011 年) 這個時間點後加入的 C++ 特性,就稱為現代 C++ (出處)。
為了相容於原有的程式碼,一些先前的手法仍然是合法的 C++ 程式碼,只是現在有更好的方式。這個現象就會讓原本就很複雜的 C++ 更加複雜。不過,C++ 本來就不是很快就上手的語言 (出處),而且也不用等到學完所有的特性才開始寫 C++ 程式;即使只學了一小部分的 C++ 特性,仍然可以寫 C++ 程式。
為什麼要學 C++?
C++ 不僅是大專院校使用的教學工具。許多重要的軟體專案都是使用 C++ (註) 撰寫而成。C++ 的爸爸 Bjarne Stroustrup 整理了一個使用 C++ 所撰寫的應用程式清單,其中不乏 GCC 等重量級軟體。有興趣的讀者可以自己看一下該清單。
(註) 很多軟體專案會混合 C 和 C++。並不總是純 C 或純 C++
是否需要先學 C 再學 C++?
原本的 C++ 和 C 比較貼近,但現代 C++ 加入了許多新的概念,和 C 就越差越遠了,基本上,還是當成兩個不同的語言來看比較好。網路上時常有「C/C++」這種寫法,這會讓學習者以為 C 和 C++ 是同一件事,但現在 C++ 和 C 差異很大,不建議繼續用這種寫法。
由於 C++ 在設計時考慮和 C 的相容性,在學習 C++ 的過程中,自然而然會學到和 C 貼近的一些語法特性,只是有些程式碼在 C++ 有更好的寫法。由於 C++ 不是 C 的嚴格超集,只是觀念相通,程式碼不一定要考慮和 C 相容,直接找 C++ 的教材來看即可。
主要的 C++ 編譯器
以下是主要的 C++ 編譯器:
- Visual C++ (MSVC)
- GCC
- Clang
在這三者中,MSVC 限定在 Windows 系統,其餘兩者則跨越多種平台。由於這三種 C++ 編譯器對 C++ 標準的支援度還不錯,通常使用系統預設的 C++ 編譯器即可。
C++ 的替代技術
技術沒有絕對的優劣。選擇語言技術是多方考量後的結果。有時候團隊偏好大於技術本身的考量。本節內容僅供參考。讀者應自行查詢其他資料。
本節的替代並不是取代,而是特性及目標領域上有重疊,如果不想使用 C++ 時可以考慮的選項。
Java
Java 的本意即為簡化 C++,將兩者放在一起比較是合理的。
雖然跨平台是 Java 的口號,但跨平台並不是選擇 Java 的真正考量。MSVC 僅限 Windows 系統,但 GCC 和 Clang 都是跨平台軟體。C++ 程式碼是跨平台的,可在多個平台上編譯後執行。
由於 C++ 有 C 的低階特性,Java 會給人比較高階的感覺。但 C++ 同樣有許多高階語法特性。兩者真正的差別是 C++ 兼具低階和高階特性,而 Java 刻意移除低階特性。
需要效能或低階特性時,當然會使用 C++。反之,想要用相對簡單的語言,效能不是優先考量,就會使用 Java。不同型態的應用程式,偏好的語言也相異。網頁程式較常使用 Java、電腦遊戲則大部分使用 C++。
C# (C sharp)
C# 是微軟所開發的 Java 替代技術。前一小節所列的考量對 C# 也適用。