1. 程式人生 > 實用技巧 >[知識點] 1.10 C與C++區別

[知識點] 1.10 C與C++區別

總目錄> 1 語言基礎 > 1.10 C 與 C++ 區別

前言

搞 OI 時,對 C 和 C++ 的差異的印象僅停留在 C++ 比 C 功能更多,以及 C++ 某些情況效率更低。所以當時雖然學的是 C++,但諸如輸入輸出均使用的 C 風格,同時 C++ 各種特性基本沒有使用過,面向物件的特性在競賽時基本也不需要接觸。

而這次進行知識點總結時,則是完全以 C++ 的角度來介紹的,但當年很多東西都沒學,一些基本的東西介紹起來竟有些拉胯。同時馬上又要考 C++ 了,又沒有正式學,所以現在是時候理清楚一些問題。

C 和 C++ 到底有什麼區別?C 是不是完全就是 C++ 的子集呢?功能相近的情況下,優先使用 C 風格還是 C++ 風格呢?

1.10 C 與 C++ 區別

1、面向物件與面向過程

C 語言是面向過程的語言,C++ 是面向物件的語言。從本質而言,C++ 有質的飛躍,但以此同時,保留了 C 語言所有的功能,所以,C 是 C++ 的子集。

面向過程的 C 語言,其首要考慮如果通過一個過程,對輸入進行運算處理而得到輸出。

面向物件的 C++ 語言,其首要考慮如果構造一個物件模型,讓這個模型契合對應的問題域,通過獲取物件的狀態資訊得到輸出。

C++ 從思想層面比 C 要更為先進,但實際編寫起來並無差異。在功能上,C++ 繼承 C 的所有特性,並有所加強,同時引入諸如過載,內聯,異常處理與面向物件設計的內容(類,繼承,虛擬函式,模板,容器等)。下面更多介紹的是 C++ 的新特性與在 C 中相對應的舊功能的差異,也就是說,C 的這些功能在 C++ 中同樣是適用的,而非完全獨立。

2、巨集與模板

關於模板的更多介紹,請參見:施工中

模板可以認為是巨集定義的旗艦版。巨集定義只是一種簡單的替換,而模板在編譯時會得到全面的編譯器檢查。

施工中

3、指標與引用

關於指標與引用的更多介紹,請參見:

對於變數傳遞而言,使用 C++ 的引用特性來實現類似指標的功能。因為引用指向的物件不能為空,所有可以避免空地址訪問。當然,指標靈活性更高,使用起來更便捷。引用和指標之間可以通過 * 和 & 運算子相互轉換。

4、結構體與類

關於結構體與類的更多介紹,請參見:

C++ 中的 struct 本質上就是類,和 class 的唯一區別是它的成員和繼承預設是 public,這一點是為了延續 C 中的 struct(儘管它並沒有 public 與 private 之分),尤其要注意這一點。

同時,宣告 struct 在 C++ 中會方便許多。

C 版 struct:

typedef struct Node {
    struct Node *nxt;
    int key;
} a;

C++ 版 struct:

struct Node {
    Node *nxt;
    int key;
} a;

4、常量 const

更多關於 const 的介紹,請參見:

在 C 語言中,const 僅用於限定變數不被修改。C++ 中,const 被賦予了更多玩法。而與 C 中 const 完全對應的繼承者是 constexpr。

5、記憶體分配

C++ 中新增了 new 和 delete 用於自由分配空間,他們是為了配合類而出現的。delete[] 可以直接釋放動態陣列的記憶體,非常方便。相比 C 中的 malloc, realloc, free 函式,他們對型別有更完善的支援,但效率不如 C。

6、輸入輸出流

C++ 中新增了 cin 和 cout 輸入輸出流函式,用以替代 C 中的 scanf 和 printf。相比之下,他們使用更為方便,不用記住各種繁瑣的識別符號,但效率不如 C。

7、其他