1. 程式人生 > >我為什麼用C++

我為什麼用C++

參加工作7年了,作為一個全棧碼農,工作中C++、Java、Python、Lua甚至前端Javascript都有涉及,但是自己私下都是用C/C++做專案(包括個人網站後臺都是用C++開發的)。

在我的技術認知範圍內C/C++能完成一切任務,我偏執地用C++實現個人筆記網站(https://www.winfengtech.com),甚至開發了一個cppshell將C/C++當作指令碼語言來使用,言歸正傳,下面單純從語言層面說一說我為什麼使用C++。

無執行環境的拖累

在執行Java、Python等應用前你需要安裝對應的執行環境或虛擬機器,然而常見作業系統自帶C/C++執行環境,你可以釋出C/C++程式給小白使用者使用,這也是桌面應大多用C++開發的原因之一。

直接呼叫作業系統原生API

作業系統都提供原生C語言API,在C++中你可以直接呼叫這些API函式。你也可以用C++的抽象能力實現類庫的核心功能,然後提供C語言介面編譯成動態庫方便Java、Python、Lua等語言呼叫。

解構函式精確控制成員的生命週期

比如說一個物件打開了一個檔案,可以在物件的解構函式中關閉這個檔案,這樣就將檔案的生命週期與物件生命週期繫結,我們不用顯式呼叫檔案的close方法,從而達到物件銷燬時自動關閉檔案的目的,C++中的std::lock_guard類在管理鎖資源時有異曲同工之妙。

魔性的運算子過載

忘記compareTo吧,在C++中你是這樣比較字串大小的。

string a = "cba";
string b = "nba";
if (a > b) puts("a>b");

高效簡單地在棧上建立物件

得益於廉潔的記憶體,現在程式一般有大幾MB甚至上十MB的執行緒棧空間,一般類物件佔用記憶體大小不會超過1K,所以在C++中你可放心在棧上建立小物件與陣列,就像下面這個樣子。

char arr[100000];        //你沒看錯,陣列長度是10萬,沒有任何問題

圖靈完備的模板超程式設計

c++的模板超程式設計能力能在編譯期間實現所有演算法,下面程式碼在編譯期間計算階乘。

template <int N> struct fact
{
    const static int value = N * fact<N-1>::value;
};

template <> struct fact<1>
{
    const static int value = 1;
};

//請注意:我是編譯期間計算的常量
const static int val = fact<5>::value;

包容一切的function物件

c++11的function物件可以儲存函式指標、函式物件、lambada表示式等一切可執行物件,大大方便在介面函式中傳入回撥方法。

萬金油般的auto關鍵字

C++11拓展了auto關鍵字的功能,你可以用auto關鍵字定義變數儲存一切函式返回值,而不丟失任何型別資訊。是的,Java可以用Object型別儲存任何類物件,但Object會丟失原始型別資訊,你需要用強制型別轉換來恢復原始型別。

vector<int> vec = {1, 2, 3, 4, 5, 6};

for (auto val : vec)
{
    cout << val << endl;
}

auto it = vec.begin();

while (it != vec.end)
{
     cout << *it << endl;
}

強大的巨集定義與預處理

C/C++沒有定義跨平臺ABI,但完全可以通過巨集定義控制編譯行為,實現原始碼級別的跨平臺。可參考跨平臺設定終端顏色的示例程式碼:https://www.winfengtech.com/compile?path=/app/compile/pub/textcolor.cpp;不僅如此,C/C++編譯器還預定義以下巨集,用來方便排定位程式碼。

__FILE__表示當前檔案路徑

__LINE__表示當前程式碼行號

__TIME__表示最近編譯時間

__DATE__表示最近編譯日期

你可以用__DATE__與__TIME__巨集來標識程式版本,用__FILE__與__LINE__定位原始碼位置,在Python、Java中你可能需要藉助異常捕獲來定位原始碼檔案與行號。

C/C++包含所有面向過程與面向物件程式設計的完整內容,比如多重繼承、運算子過載、靜態繫結與動態繫結等,精簡語言核心,不提供五花八門的通用類庫,給程式設計師更大的自由度,可謂程式語言中的九陽神功,一通百通,給學習其他程式語言提供加成助力。

最後推薦一個線上C++編譯器:https://www.winfen