回覆列表
  • 1 # TonyDeng

    按照C++之父的說法,這是兩種不同的語言,他直接說不要把C++看作是C的超集,C++只是某種程度上相容C的語法而已,他反對用C的思維去寫C++程式。這與很多人說學C自然懂C++截然相反,他說不需要從C學起,那樣起步實際上妨礙正確學習C++。

  • 2 # dttsw

    理個思路,寫個詳細答案。

    C語言與C++最大區別在,C++可面向物件程式設計。C絕大多數時候面向過程,這是普通碼農認知。

    C++是C的超集,隨著新的語言規範退出,已經不成立。C與C++已經走了完全不同的方向。新的C++相容不了新的C規範。C++標準的重量級實施巨頭,微軟甚至放棄新版C的支援。較新版的VS根本沒純粹編寫C語言的選項。且對C的相容限於C99規範。

    但如XCode,GCC對新版C語言規範支援比較好,經我研究發現XCode編譯器還是用的GCC,我沒搞明白,clang是蘋果自己高的東東,有網友吹得神乎其神,蘋果為什麼會用GCC坐XCode的編譯器。說到底,XCode對C的支援在gcc之上封了一層皮。

    關於C語言面向物件程式設計問題,經過我研究,看從那個角度來理解,網上說法我大多不認同。我認為C語言除了無繼承特性,基本就是在面向物件程式設計,物件是結構與基本資料型別與函式的組合。只有這麼一點點還不足已說明,C語言可以面向物件程式設計。C語言的編譯過程中,涉及道編譯單元,就是C原始碼檔案,連結特性,可以對C的編譯單元做封裝。因為C語言完全可以做到,把方法,資料限於一個編譯單元內,其它檔案(這裡等同於編譯單元)內無法引用這些資料或者函式。

    C++有純粹面向物件特性,這不講了。

    而且C++引入的面向物件特性,引入了很多理念與需要解決的問題。多重繼承,構造,解構函式,虛擬函式等等,而且這些特性用不好極容易造成記憶體洩露。為解決C++存在弊端,STL搞了很多工具與額外規範需要學習。如自動記憶體管理設計的智慧指標,如果沒有超強的理解,智慧指標極容易用錯。STL裡面的資料結構與演算法略過,搞C、C++的都不是什麼大問題。

    C語言與C++可以混編,我理解混編是指C++可以利用C語言編寫的庫,這裡思路很明確,充分利用已有程式碼。但從微軟整合混編來看,網友解釋,混編解決C與C++單獨編譯的問題。原因因為C++引入了面向物件機制,編譯產生的符號表不太一樣。我傾向於混編主要利用C寫好的功能,這塊我稍有研究,因為都寫C++何必搞C。

    以上我認為C++比C麻煩的地方,沒C簡潔,真正搞C++額外學很多知識,包括boost庫。新的C++規範,關於執行緒,個人認為是設計敗筆,作業系統有了,且現有程式碼絕大多數基於作業系統提供的執行緒API做的。我感覺新版C++規範想參考java改進但又做不了java那麼簡便。

    (來個電話把思路打斷!)

    C語言主要用來編寫作業系統並提供作業系統API,C++不直接提供作業系統API,所以C++面向作業系統程式設計一樣得用C提供的API,所以前面提的混編在這裡也解釋得清。作業系統程式設計有些書籍會直接用C++講。我看過的基於C講,所以理念應該不變。

    最後C與C++的應用,主要系統底層元件程式設計,直接利用系統底層API來實現更高層次功能,比如java虛擬機器、python虛擬機器、node.js使用的V8引擎。圖形化介面程式設計也有API如Windows程式設計有C語言API,MFC框架基於C語言API封裝了一套C++API,還有QT。mac上圖形化API 有objective-c,有swift。UNIX上圖形化介面應該也基於C、C++提供,大名鼎鼎的openoffice就是用C++編寫的。C與C++還可以用來做裝置驅動程式,嵌入式系統開發,物聯網應用開發。其它主流應用就不是很清楚。

    實際上C與C++是萬能語言,現有的所有應用都可以基於他們去開發。只是這兩語言不適合快速開發。時下很火的網際網路應用大多不會採用C語言、C++開發。

    最後,給補充幾個C、C++開發的經典應用,Oracle與MySQL資料庫,redis,nginx。

  • 中秋節和大豐收的關聯?
  • 有什麼護膚產品保溼效果好?