華文網

太多人不懂C和C++,C與C++真正區別在哪裡?!

這幾年不管是社團實習工作面試都有被問到這個問題。但是“物件導向以及面向過程”這個回答似乎都不是最好或者最完善的答案。除了物件導向與面向過程這個回答之外,

C與C++的真正區別在哪裡?想必很多人都對這個問題有所好奇吧?

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

簡單來說

C++是C發展來的。

C++是物件導向的語言,而C是結構化的語言(面向過程)。

C的大部分代碼在C++上都能應用,而C++的代碼在C上不能應用。(記住是大部分,

不是所有)

具體來說:C語言是一個結構化語言,它的重點在於演算法與資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事物)控制)。C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事物)控制。所以C語言和C++的最大區別在於它們解決問題的思想方法不一樣。

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

C++ 是 C 的超集合,只有少量功能 C++ 不支援。

C++ 多出來的東西太多,很難列舉,我截 cppreference 的圖直觀比較一下吧。

C language

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

C++ language

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

可以看到,C++ 比 C 多了 classes、templates、exceptions 這些部分,而每個部分也有很多新增的東西。這還只是語言部分,還未談及標準庫。

C 有 29 個標準庫標頭檔,C++ 有 87 個,除了量,C++ 標準庫的功能要複雜得多。

C語言主要用於嵌入式領域,驅動開發等與硬體直接打交道的領域

C++可以用於應用層開發,使用者介面開發等於作業系統打交道的領域

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

C++對C的“增強”,表現在幾個方面

(1) 類型檢查更為嚴格。

(2) 增加了物件導向的機制。

(3) 增加了泛型程式設計的機制(Template)。

(4) 增加了異常處理。

(5) 增加了運算子重載。

(6) 增加了標準範本庫(STL)。

(7)增加了命名空間,避免全域命名衝突。

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

與C不相容之處

上面說了C的大部分代碼在C++上都能run的溜溜的,但是也有少數C代碼會在C++中失效,或者在C++中有不同的行為。例如:隱式轉換。

1).最常見的差異之一是,C允許從void*隱式轉換到其它的指針類型,但C++不允許。下列是有效的C代碼:

//從void*類型隱式轉換為int*類型

int*i=malloc(sizeof(int)*5);

但要使其在C和C++兩者皆能運作,就需要使用顯式轉換:

int*i=(int*)malloc(sizeof(int)*5);

2).在C中,多次聲明一個全域變數雖然不可取,但不算錯.在C++中,多次聲明同一個全域變數會引發錯誤.

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

3).另一個常見的可移植問題是,C++定義了新關鍵字,例如如new,class,它們在C程式中可以作為識別字(例:變數名)的。

在C標準(C99)中去除了一些不相容之處,也支持了一些C++的特性,如//注解,以及在代碼中混合聲明。不過C99也納入幾個和C++衝突的新特性(如:可變長度陣列、原生複數類型和複合逐字常數)。

4).若要混用C和C++的代碼,則所有在C++中調用的C代碼,必須放在 extern "C" { /* C代碼 */ } 內。

在你使用過程中遇到的問題可能比這裡講的要多,沒關係,你只要記住沒有一個程式師不是從問題堆裡走出來的就行了。

講了這麼多,是不是對C和C++有了更深刻的瞭解。兩者各有長處,各有缺點,其實就看你在哪個領域去用它。

希望這篇文章能對你們有所幫助。想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711,大家一起學習交流,共同學習,共同進步。

與C不相容之處

上面說了C的大部分代碼在C++上都能run的溜溜的,但是也有少數C代碼會在C++中失效,或者在C++中有不同的行為。例如:隱式轉換。

1).最常見的差異之一是,C允許從void*隱式轉換到其它的指針類型,但C++不允許。下列是有效的C代碼:

//從void*類型隱式轉換為int*類型

int*i=malloc(sizeof(int)*5);

但要使其在C和C++兩者皆能運作,就需要使用顯式轉換:

int*i=(int*)malloc(sizeof(int)*5);

2).在C中,多次聲明一個全域變數雖然不可取,但不算錯.在C++中,多次聲明同一個全域變數會引發錯誤.

想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711

3).另一個常見的可移植問題是,C++定義了新關鍵字,例如如new,class,它們在C程式中可以作為識別字(例:變數名)的。

在C標準(C99)中去除了一些不相容之處,也支持了一些C++的特性,如//注解,以及在代碼中混合聲明。不過C99也納入幾個和C++衝突的新特性(如:可變長度陣列、原生複數類型和複合逐字常數)。

4).若要混用C和C++的代碼,則所有在C++中調用的C代碼,必須放在 extern "C" { /* C代碼 */ } 內。

在你使用過程中遇到的問題可能比這裡講的要多,沒關係,你只要記住沒有一個程式師不是從問題堆裡走出來的就行了。

講了這麼多,是不是對C和C++有了更深刻的瞭解。兩者各有長處,各有缺點,其實就看你在哪個領域去用它。

希望這篇文章能對你們有所幫助。想要更多學習資料,在學習C/C++或者想學習C/C++可以加群:304604711,大家一起學習交流,共同學習,共同進步。