本文介紹 c 與 c++ 之間重要的或者容易忽略的區別。儘管 c++幾乎是 c 的超集,c/c++ **混用一般也沒什麼問題,但是了解 c/c++ 間比較重要區別可以避免碰到一些奇怪的 bug。
如果你是以 c 為主力語言的 oier,那麼本文也能讓你更順利地上手 c++。
c++ 的模板在設計之初的乙個用途就是用來替換巨集定義。學會模板程式設計是從 c 邁向 c++ 的重要一步。模板不同於巨集的文字替換,在編譯時會得到更全面的編譯器檢查,便於編寫更健全的**,利用 inline 關鍵字還能獲得編譯器充分的優化。模板特性在 c++11 後支援了可變長度的模板參數列,可以用來替代 c 中的可變長度函式並保證型別安全。
c++ 中你仍然可以使用 c 風格的指標,但是對於變數傳遞而言,更推薦使用 c++ 的引用特性來實現類似的功能。由於引用指向的物件不能為空,因此可以避免一些空位址訪問的問題。不過指標由於其靈活性,也仍然有其用武之處。值得一提的是,c 中的null
空指標在 c++ 中有型別安全的替代品nullptr
。引用和指標之間可以通過*
和&
運算子相互轉換。
儘管在 c 和 c++ 中都有 struct 的概念,但是他們對應的東西是不能混用的!c 中的 struct 用來描述一種固定的記憶體組織結構,而 c++ 中的 struct 就是一種類,它與類唯一的區別就是它的成員和繼承行為預設是 public 的,而一般類的預設成員是 private 的。這一點在寫 c/c++ 混合**時尤其致命。
另外,宣告 struct 時 c++ 也不需要像 c 那麼繁瑣,c 版本:
typedef
struct node_t node;
c++ 版本
struct node
;
const 在 c 中只有限定變數不能修改的功能,而在 c++ 中,由於大量新特性的出現,const 也被賦予的更多用法。c 中的 const 在 c++ 中的繼任者是 constexpr。
c++ 中新增了new
和delete
關鍵字用來在「自由儲存區」上分配空間,這個自由儲存區可以是堆也可以是靜態儲存區,他們是為了配合「類」而出現的。其中delete
還能夠直接釋放動態陣列的記憶體,非常方便。new
和delete
關鍵字會呼叫型別的建構函式和析構函式,相比 c 中的malloc()
、realloc()
、free()
函式,他們對型別有更完善的支援,但是效率不如 c 中的這些函式。
簡而言之,如果你需要動態分配記憶體的物件是基礎型別或他們的陣列,那麼你可以使用malloc()
進行更高效的記憶體分配;但如果你新建的物件是非基礎的型別,那麼建議使用new
以獲得安全性檢查。值得注意的是儘管new
和malloc()
都是返回指標,但是new
出來的指標只能用delete
**,而malloc()
出來的指標也只能用free()
**,否則會有記憶體洩漏的風險。
c 語言與C語言的區別
c 之類的語言是物件導向的。使用這樣的語言程式設計被稱為物件導向程式設計 object oriented programming,oop。它可以讓計算機程式設計師將乙個物件導向的設計實現稱為乙個可工作的軟體系統 c之類的語言是過程性 procedural 所以程式設計總是面向動作的。在c語言中,程式...
c語言 與 的區別
最近在用指標,所以將有關指標的 和 的問題總結一下。首先介紹一下指標。指標是指指向的位址,指標本身只占有4個位元組,例如 char pt,sizeof pt 4,不論指標的值是什麼或者它所指向的型別是什麼,它 的空間分配只占有4個位元組,但是sizeof char 1。在這裡補充一下c語言的基 本型...
c語言與C 的區別
c語言與c 的區別有很多 1,全新的程式程式思維,c語言是面向過程的,而c 是物件導向的。2,c語言有標準的函式庫,它們鬆散的,只是把功能相同的函式放在乙個標頭檔案中 而c 對於大多數的函式都是有整合的很緊密,特別是c語言中沒有的c 中的api是對window系統的大多數api有機的組合,是乙個集體...