個人觀點(C++雖功能強大,但是底層還是調用C,C++為了吸引更多的C程序員,功能過於豐富且復雜,一定程度上反而降低了可編程的實用性。但是不可否認C++
也是一門藝術。)
C++是一門以C為基礎發展而來的一門面向對象的高級程序設計語言,從1983年由Bjarne Stroustrup教授在貝爾實驗室創立開始至今,已有30多個年頭。C++從最初的C with class,經歷了從C++98、C++ 03、C++ 11、C++ 14再到C++17多次標准化改造,功能得到了極大的豐富,已經演變為一門集面向過程、面向對象、函數式、泛型和元編程等多種編程范式的復雜編程語言,入門具有一定的難度。由於C++過於復雜,並且經歷了長時間的發展演變,目前對於C++標准支持的較好主要有GNU C++和Visual C++,嚴格來說,目前還沒有一個完全支持ISO C++的版本。
1954年,John Backus發明了世界上第一種計算機高級語言Fortran,為之后出現的高級編程語言奠定了基礎。1970年,AT&T的Bell實驗室的 Ken Thompson,以BCPL語言為基礎,設計出簡單且接近硬件的B語言(取BCPL的首字母),並且他用B語言寫了第一個Unix操作系統。到了1972年,Bell實驗室的Dennis Ritchie和Ken Thompson共同發明了C語言,並使用C重寫Unix。1979年,Bjame Stroustrup到了Bell實驗室,開始從事將C改良為帶類的C(C with Classes)的工作,1983年該語言被正式命名為C++,主要意圖是表明C++是C的增強版,1985年發布了第一個C++版本。
第一個版本的C++,因其面向對象的思想使得編程變得簡單,並且又保持了C語言的運行效率,在推出的一段時間內,得到了快速的發展,占據了編程語言界的半壁江山。從1985年到1998年,C++從最初的C with Classes新增了很多其他的特性,比如異常處理、模板、標准模板庫(STL)、運行時異常處理(RTTI)與名字空間(Namespace)等。1998年,C++標准委員會統籌C++的所有特性,發布了第一個C++國際標准C++98。從1998年到2003年,是C++標准從C++98到C++03的迭代期,期間C++擴增了很多額外的特性,比如以Boost MPL(Boost Metaprogramming Library)與Loki等為代表的模板元編程庫的出現,讓開發者更加便捷的使用C++在編譯期的執行能力,即通過代碼編譯獲得計算結果,學術性的稱為模板元編程。到了2003年,C++標准委員會總結最新技術並發布了C++03標准。從2003年到2011年,也就是從C++03到C++11,期間C++引入了對象移動、右值引用、lamba表達式(函數式編程)、編譯時類型識別(auto)、別名模板以及很多新型關鍵詞(如nullptr、decltype、constexpr)等現代編程語言常具備的能力,讓C++與時俱進,開發效率得到了很大的提升。這些新的特性隨着C++11標准的發布而被正式確立下來。近年來,C++標准的變更周期縮短,由C++11到C++14以及最近的C++17都只用了3年的時間。C++14引入了二進制文字常量、將類型推導從Lambda函數擴展到所有函數、變量模板以及數字分位符等。C++14 是對 C++11的重要補充和優化,是C++發展歷程中的一個小型版本,雖然新增的內容較少,但是仍然為用戶“帶來了極大的方便”,為實現使C++“對新手更為友好”這一目標作出努力。到了2017年,C++迎來了C++17標准。此次對C++的改進和擴增,讓C++變得更加容易接受和便於使用了。C++17引入了許多新的特性,比如類模板參數推導、UTF-8文字常量、fold表達式、新類型以及新的庫函數等。
C++仍在不斷的發展,下一個版本將是C++20,C++歷史上的標准變更如下。
年份 | C++ 標准名稱 | 非正式名稱 |
1998 | ISO/IEC 14882:1998 | C++98 |
2003 | ISO/IEC 14882:2003 | C++03 |
2011 | ISO/IEC 14882:2011 | C++11 |
2014 | ISO/IEC 14882:2014 | C++14 |
2017 | ISO/IEC 14882:2017 | C++17 |
2020 | Yet to be determined | C++20 |
語言的發展是一個逐步遞進的過程,C語言也不例外,C語言也有自己的標准。C語言從1972誕生以來,先后經歷了K&R C、ANSI C、C89、C99和最新的C11標准的變更,其特性不斷豐富,功能不斷強大。語言的發展也是相互促進和交融吸收的,C++是直接從C語言發展過來的,而C語言是從B語言發展過來的,B語言則是從BCPL發展而來,BCPL(Basic CPL)則從CPL發展而來,CPL則從ALGOL60演變而來。每一門新語言的誕生以及后續的演變和發展,都站在了其他語言的肩膀之上,取其精華,棄其糟粕,讓語言變得更加的強大。
優缺點:
現在的趨勢是多語言混成編程,故本文是針對混合編程。
1,C++優勢:
1.1,性能優勢。
1.2,可進化性(可復用性),進化出本團隊順手的類庫。
2,C++小的優勢或疑似優勢:
2.1,“萬金油”。混合編程時代,“萬金油”價值小。
-
相對於其他的語言,C++具有它自己的優勢,主要體現在以下幾個方面:
1、 C++實現了面向對象程序設計。在高級語言當中,處理運行速度是最快的,大部分的游戲軟件,系統都是由C++來編寫的。
2、 C++語言非常靈活,功能非常強大。如果說C語言的優點是指針,那么C++的優點就是性能和類層次結構的設計。
3、C++非常嚴謹、精確和數理化,標准定義很細致。
4、 C++語言的語法思路層次分明、相呼應;語法結構是顯式的、明確的。
當然,這只是C++的一部分優勢,在運用過程中,我們會逐漸發現C++語言之美。
3,C++根本缺點:
難學。新手被指針搞死,中手(約3年工作經驗)被stl標准庫和模板搞死,高手(約5年工作經驗)被boost搞死。由於stl難懂,大量的項目禁用stl。我曾經看了一段20行的stl代碼,看了30分鍾,發現兩行代碼(兩個for)就可以搞定。csdn有一個真實的案例,某個項目有了較多的boost,那人離職后,項目就費了。請一個boost高手的成本比重寫項目還高。
4,緩解的方法:
C++軟件工程師進一步分工:
a,新手主要負責界面,只需要會使用指針,無需管理指針。管理指針封裝在基礎庫中。
b,中手老手負責邏輯層。
c,專人負責與數據庫打交道。
5,C++非根本缺點:
5.1可理解性差。“難學”引起,其實熟悉stl的人看熟悉stl的人代碼很好理解。解決方法:
a,分成若干個庫,新手參與的庫,禁止或少用stl。
b,stl中的常用功能,重寫在一個新庫中,此庫可理解性最重要。
6,小缺點或不是缺點。
6.1.門檻高。新手無需用到指針管理、內存管理、線程管理,直接用stl的vector或MFC的CArray分配空間。內存管理、線程管理一個產品、項目只需要一個人會,就可以了。
6.2,開發效率低。如果有多年積累的基礎庫,開發效率反而高。因為這些基礎庫,是非常適合當前團隊的。
6.3,初級程序員易犯錯誤。初級程序員,只有權限修改少量庫(以界面居多)。
C++兩個關鍵缺陷
即語言的過度復雜和標准庫的過度蒼白。
C++語言過於復雜在業界是共識。一個指針就使C++比關鍵字數目相同的語言復雜許多,導入模板后各種應用精巧的應用使這門語言進一步復雜化,而C++0x使這復雜性又升華了。
C++語言已經無法簡化,如果編譯器能夠提供可定制編譯也許對這個語言會有幫助。比如:設定某個選項后,C++就變成了有對象的C。設置某個選項后,多重繼承就不支持了。可是這樣的發展也還是需要很長一段時間的發展的。
C++語言功能是很強大的,其運行效率也一度得到很多人的肯定,但是事物優缺點的同時存在是客觀事實,我們應該正視這點,這也是我們南寧達內科技講師提醒學生們應該要注意的一點,在運用過程中,要了解C++語言所存在的兩個關鍵性的缺陷,這樣才能避免實際操作中的更多的錯誤。
相對與java和C
寬泛點來說,從結果角度上看C幾乎什么都能做,C++幾乎什么都能做好。但是從開發成本上說,很多情況下C/C++不是最好的選擇。眼下C最主要的使用領域應該是Unix系系統的開發以及某些Unix系系統的軟件的相關開發。C++恐怕還是游戲開發。
作為通用語言,可以適應各種類型的開發算是必備屬性(同理,Java其實也是幾乎什么都能做,只是限制相對來說要大一點並且很多事情做不了那么好)。C/C++的規則比較寬泛,可以用來進行一些更貼近硬件的開發,而大部分C/C++開發環境也是這么做的。這造成相對來說用C/C++開發往往對其他語言的依賴比較小。
C++方面,因為C++還同時具有完整的元編程功能(雖然並不特別好用),使得在保證功能的前提下也是目前性能最高的語言之一。所以當開發一個軟件特別是對性能有需求的軟件的時候,就算別的開發語言都不能用,最后總還是有C++可以用。
不過C/C++有一個通病就是開發成本高。雖然什么都能做,但是大部分領域都有比它們更方便、人力成本更低的語言,只有實在不行的時候才需要考慮C++。而C目前幾乎只限於一些原本就用C開發的老項目。所以現在對C/C++工程師的需求並不大。