我爲什麼用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.winfengtech.com/compile

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章