1. 程式人生 > >C和C++的區別

C和C++的區別

constexpr rtti 不同 編譯 move val 運行時 編譯器 c++

1)、標準:分別隸屬於兩個不同的標準委員會。C以C99標準為主流,C11已經發布;C++以C++98/03為主流,C++11/14也日趨流行。
2)、語言本身:
1、C++是面向對象語言,C是面向過程語言。
2、結構:C以結構體struct為核心結構;C++以類class為核心結構。
3、多態:C可以以宏定義的方式“自定義”部分地支持多態;C++自身提供多態,並以模板templates支持編譯期多態,以虛函數virtual function支持運行期多態。
4、頭文件的調用:C++用< >代替” “代表系統頭文件;且復用C的頭文件時,去掉”.h”在開頭加上”C”。
5、輸入輸出:鑒於C++中以對象作為核心,輸入和輸出都是在流對象上的操作。
6、封裝:C中的封裝由於struct的特性全部為公有封裝,C++中的封裝由於class的特性更加完善、安全。
7、常見風格:C中常用宏定義來進行文本替換,不具有類型安全性;C++中常建議采用常量定義,具有類型安全性。
8、效率:常見的說法是同等目的C通常比C++更富有效率(這其實有一定的誤解,主要在於C++代碼更難於優化且少有人使用編譯期求值的特性)。
9、常用語言/庫特性:
a、數組:C中采用內建數組,C++中建議采用vector。相比之下vector的大小可以動態增長,且使用一些技巧後增長並不低效,且成員函數豐富。
b、字符串 C中采用C風格的string(實則為字符串數組),C++中建議采用string,對比與上一條類似。
c、內存分配:C中使用malloc與free,它們是是C標準庫函數,C++中建議使用new/delete代替前者,他們說是C++的運算符(這是筆試面試常考點)以C++中的new為例,new可分為operator new(new 操作)、new operator(new 操作符)和placement new(定位 new)。其中operator new執行和malloc相同的任務,即分配內存,但對構造函數一無所知;而 new operator則調用operator new,分配內存後再調用對象構造函數進行對象的構造。其中operator new是可以重載的。placement new,就是operator new的一個重載版本,允許你在一個已經分配好的內存中構造一個新的對象。
d、指針:C中通常使用的是原生指針(raw pointer),由於常出現程序員在申請後忘記釋放造成資源泄漏的問題,在C++98中加入了“第一代”基於引用計數的智能指針auto_ptr,由於初代的各種問題(主要是無法解決循環指針),在03標準也就是TR1中引入了shared_ptr,weak_ptr和unique_ptr這三個功能各異的智能指針,並與11標準中正式確定,較好的解決了上述問題。
三、僅有C++才有的常用特性:
1、語言(範式)特性:
a、面向對象編程:C++中以關鍵字class和多態特性支持的一種編程範式;
b、泛型編程:C++中以關鍵字template支持的一種編程範式;
c、模板元編程 :C++中以模板特化和模板遞歸調用機制支持的一種編程範式。
d、C++中以對象和類型作為整個程序的核心,在對象方面,時刻註意對象創建和析構的成本,例如有一個很常用的(具名)返回值優化((N)RVO);
在類型方面,有運行時類型信息(RTTI)等技術作為C++類型技術的支撐。
e、函數重載:C++允許擁有不同變量但具有相同函數名的函數(函數重載的編譯器實現方式、函數重載和(主)模板特化的區別都曾考過)。
f、異常:以catch、throw、try等關鍵字支持的一種機制。
g、名字空間:namespace,可以避免和減少命名沖突且讓代碼具有更強的可讀性。
h、謂詞用法:通常以bool函數或仿函數(functor)或lambda函數的形式,出現在STL的大多數算法的第三個元素。
2、常見關鍵字(操作符)特性:
a、auto:在C中,auto代表自動類型通常都可省略;而在C++11新標準中,則起到一種“動態類型”的作用——通常在自動類型推導和decltype搭配使用。
b、空指針:在C中常以NULL代表空指針,在C++中根據新標準用nullptr來代表空指針。
c、&: 在C中僅代表取某個左值(lvalue)的地址,在C++中還可以表示引用(別名)。
d、&&:在C中僅能表示邏輯與,在C++中還可以表示右值引用。
e、[]:在C中僅能表示下標操作符,在C++中還可以表示lambda函數的捕捉列表。
f、{}:在C中僅能用於數組的初始化,在C++中由於引入了初始化列表(initializer_list),可用於任何類型、容器等的初始化。
g、常量定義:C中常以define來定義常量,C++中用const來定義運行期常量,用constexpr來定義編譯器常量。
3、常用新特性:
a、右值引用和move語義(太多內容,建議自查)。
b、基於範圍的for循環(與python中的寫法類似,常用於容器)。
c、基於auto——decltype的自動類型推導。
d、lambda函數(一種局部、匿名函數,高效方便地出現在需要局部、匿名語義的地方)。
e、標準規範後的多線程庫。

C和C++的區別