C與C++對比
<1>.C/C++
C過程性語言,重點在演算法和資料結構。
(C作為C++自洽子集)
C++面向過程語言,首要考慮如何構造一個物件模型
<2>.C++的主要內容
基礎知識
關鍵字
資料型別
C++輸入輸出
函式
指標
類
標準庫
迭代器
容器類庫
輸入輸出類庫(C++標準輸入輸出)
演算法(泛型演算法)
字串庫(字串數字,字串函式)
正則表示式
執行緒庫
實用庫等.
(C++語言中的封裝、資料隱藏、繼承、多型的實現,主要包括類的宣告、物件定義、建構函式和解構函式、運算子過載、繼承和派生、多型性實現)
<3>.C++相比C支援的新特性:
- 支援函式過載:C語言對變數型別最為敏感,不支援函式過載。而C++語言支援函式過載。 1). 由於引數有型別提升和隱式轉換的需求(例如可以將short提升為int,將int提升為long或者double等),所以C++還定義了一套複雜的規則來實現資料型別的顯示和隱式轉換
2). 同一個作用域內,函式名相同,引數列表不同
3). 函式匹配,編譯器首先將呼叫的實參與過載集合每一個函式形參進行比較,然後決定呼叫那個函式
- 支援操作符過載:操作符過載也是C++的典型高階應用,和函式過載有類似的地方,可以讓程式碼更加簡潔和通俗易懂。
1). C++中只有五個操作符不支援過載:. (成員訪問運算子),.*
2). 作用於類型別運算物件,過載運算子即為具有特殊名字的函式,name=operator+“運算子”
3).對於運算子函式,要麼是類的成員,要麼至少含有一個類型別的引數
4).過載運算子函式引數=運算子作用物件
- 支援行內函數:1).由於行內函數在函式呼叫點直接在編譯階段就將程式碼展開,所以其實是以程式碼膨脹的代價來減少了函式呼叫的代價。這對於實現簡單且呼叫頻繁的函式而言比較有優勢。
2).函式呼叫要先儲存暫存器,並在返回時恢復;可能需要拷貝實參;行內函數則無標準的函式棧幀的開闢和回退
3).行內函數於函式返回型別前面加inline,內聯說明只是向編譯器發出一個請求,而編譯器可以選擇忽略
4).行內函數通常放於標頭檔案中(基於inline函式可以多次定義,但必須保持一致)
- 支援const:讓常數性成為與型別不可分割的一部分,除了提升安全,讓編譯器承擔檢查的責任之外,也有助於程式碼的優化。
1). const物件一旦建立其值便不可改變,所以必須被初始化
2). const物件預設只在檔案內有效,編譯器在編譯過程中將其替換成相應的值;在const定義或者宣告前加上extern,即可被其它檔案訪問
- 支援引用(reference):1). 基於內建型別定義的複合型別,簡化指標的語法,並有效減少指標的使用。
2). 引用即別名,int &refVal=ival 引用必須被初始化
- 支援流操作符:流操作符使得C++的IO變得統一,並且可以提供更為強大的功能。
1). I/O類 包括 iostream,fstream(檔案流) sstream (字串流)
- 支援類和麵向物件程式設計(OOP):這是C++相比於C最大的區別。由於支援類,所以C++中就有了資料封裝、繼承、多型、虛擬函式等概念。
由於支援面向物件,所以利用C++就可以很好地在軟體系統設計中採用設計模式,從軟體工程學的角度來提高系統的可擴充套件性和程式碼的可複用性。不過由於C++同時支援面向過程,所以嚴格意義上來講它並非完全的面向物件(相比而言Java才是真正意義上的完全面向物件)。
- 支援模板和通用程式設計(GP):個人認為這是C++除了類之外和C最大的區別和進步了。由於模板可以在一定程度上將程式設計和實現中的演算法和資料分離,所以相比於C,C++也就更具有“設計”的概念
//編譯器以函式實參來例項化
template <typename T>
int hanshu(const T &t1,const T &t2){
/*
函式體將要執行的操作
*/
return 0;
}
- 支援RAII:RAII(resource acquisition is initialization)即資源獲取即初始化(在棧空間中)。這種特性比較獨特,在C/C#/Java中都沒有相應功能。
<4>.C++相比C特點
- 更嚴格的型別檢查系統:包括異常處理、RTTI(run-time type identification)等。
- 更豐富的標準庫:C 語言也有標準的函式庫,但它們是鬆散的,只是把功能相同的函式放在一個頭檔案中;而 C++ 對於大多數的函式都是整合的很緊密。尤其是當STL被C++標準委員會吸納為標準之後,C++標準庫的豐富程度大大提高了。
- 更強大的結構定義:C 和 C++ 中都有結構的概念,但是兩者有如下三個方面的區別:
1)在 C 語言中結構只有成員變數,而沒成員方法,而在 C++ 中結構中,它可以有自己的成員變數和成員函式;
2)在 C 語言中結構的成員是公共的,而在C++中允許定義public, protected和private三種級別的訪問許可權;3)C中的結構體不可以繼承,而C++的結構體可以被繼承