2010-09-07 68 views
22

我有時閱讀關於爲什麼C++好或壞的討論,有時候其中一個論點引用了今天的現代C++與舊C++非常不同。我想知道究竟會有什麼區別?什麼是'現代'C++的例子,以及這個'舊'C++的例子(最好是做同樣的事情)?什麼是現代C++?

+3

沒有實際的引用或引用,很難確切地知道你在說什麼。你能提供一個鏈接或參考,所以我們知道你讀的是什麼? – 2010-09-07 18:08:08

回答

24

大量使用標準庫和STL,異常和模板 - 而不是隻帶類的C

+1

我想添加元編程 – Anycorn 2010-09-07 19:27:39

+0

@Martin Beckett STL是標準庫的一部分。 – 2010-09-07 19:33:51

+1

@A-ha,STL通常用作一種非正式的方式來引用標準庫的「新」部分。 – 2010-09-07 19:49:44

8

一個很明顯的區別是,在「舊式」 C++,你會看到new手動創建和銷燬許多對象與delete。在現代C++中,儘可能在堆棧上創建一個對象,或者至少包裝在某種智能指針中。

另一個區別是舊式C++更注重面向對象,而現代C++使用多種編程風格:過程式,模塊式,對象式和通用式。在現代C++中,免費函數被認爲是一件好事,然而他們會被推到舊式C++的某些類中。

其他明顯的差異包括使用結構和庫變得足夠成熟和穩定的生產代碼中使用的:模板,異常,命名空間,STL等

+6

+1在我們的主要產品中沒有一個'delete'。 – Cubbi 2010-09-07 20:10:58

+4

@Cubbi:啊,但有多少''新? – 2010-09-07 22:16:05

+0

@John Dibling:624'new's現在。 – Cubbi 2010-09-07 22:37:00

19

「現代」 C++是不害怕使用任何或所有以下內容:

  • RAII
  • 標準庫容器和算法
  • 模板
  • 元編程
  • 例外
  • 升壓

「老」 C++傾向於避免這些東西由於明顯缺乏的編譯器的支持或運行時的性能。相反,你會發現...

  • 很多newdelete
  • 滾你自己的鏈表等數據結構
  • 返回代碼爲錯誤處理
  • 的一個機制數以百萬計的自定義字符串類不是std::string

與所有這些與那個參數一樣,這兩種方法都有優點。現代C++不是普遍更好。例如,嵌入式環境通常需要大多數人從不需要的額外限制,因此您會在那裏看到很多舊式代碼。總的來說,我認爲你會發現大多數現代功能都值得使用。摩爾定律和編譯器的改進已經考慮了避免新東西的大多數原因。

+1

我認爲*不幸*現代C++不怕例外。不是我不喜歡例外,而是人們濫用它們...... – 2010-09-08 06:23:53

+0

@Matthieu,不幸的是,更多*程序員*當他們應該是時並不害怕他們。 (微軟的)Raymond Chen沒有說過他不夠聰明可以使用它們嗎? – 2010-09-08 11:48:32

+2

我認爲他這樣做是爲了震撼:)但是異常會在代碼中引入跳轉,使得難以執行執行路徑,尤其是因爲這些跳轉是隱藏的。如果保留到真正的特殊條件,那麼它並不重要,但是如果任何調用的操作員可能會失敗,那麼您將處於一個受到傷害的世界(維護方面)。我決定(不久前)儘可能地嘗試和免除程序。畢竟,'find'方法找不到結果是正常的。 – 2010-09-08 13:28:16

6

在C++中有很多東西都被認爲是現代

首先,我認爲,模板的出現是非同尋常的。不僅STL本身,而且導致模板元編程開發的模板的「常規」使用也較少。注意例如即將出現的標準版本中enable_if的存在。

這是最顯着的特點,我認爲中下的運動++程序員誰尋求通過建設執行正確性:

  • 喜歡編譯器錯誤運行錯誤>模板/類型安全的,而不是省略號/ void*
  • 使用範圍內綁定資源管理(又名RAII,但一點點的更清楚了)

這項研究的高品質,也導致了普遍使用的:

  • 的STL(算法和數據結構已被徹底測試,即使STL是由設計相當不安全的不幸)
  • Boost庫(由專業程序員審查,準無缺陷,高度便攜)

回顧這些庫也證明了C++程序員不再有對那些面向對象的語言自卑的複雜:現在從這個複雜的解脫出來,我們不要猶豫,混合各種範式(OO,通用,程序)來實現我們的目標。總而言之,我認爲Modern C++更多的是一種心態。我們(C++程序員)試圖從可怕的未定義的行爲中解脫出來,它已經困擾了我們這麼長時間,並試圖釋放我們的用戶(通過定義不允許的接口)。我們也接受其他人來之前的事實,並且重複使用現有的圖書館並不表示軟弱。

+1

更值得注意的是,模板從未打算用於如何使用它們。它不像Stroustrup開始創建一個在編譯時執行的圖靈完備的子語言。 – 2010-09-08 11:46:07

+0

@Kristo:我同意,偶然發現他們形成了Turing Complete語言,我仍然每個月都會發現新的有趣用法(而不是我自己:我確實讀了很多)。更有意思的是,他們在C++中引入了函數式編程習語,因爲C++中類型的內在不變性:) – 2010-09-08 13:30:08