C++是一門這樣的編程語言:
- 兼顧底層計算機硬件系統和高層應用抽象機制
- 從實際問題出發,注重零成本抽象、性能、可移植性、與C兼容
- 語言特性和細節很多,學習成本較高,是一門讓程序員很難敢說精通的語言
C++是自由的,支持5種編程風格:
- 面向過程編程
- 數據抽象編程
- 面向對象編程
- 泛型編程
- 函數式編程
C++的重要歷史階段
縱觀C++的整個發展和演化的歷史,C++經歷了5個重要的時期:
- C with classes: 站在C語言的肩膀上
- 標準化前的C++: C++正式問世,不斷演化,走向標準化之路
- C++98: 第一個國際標準化的版本
- C++11: Modern C++
- C++20: 感覺像一門新的編程語言
1979 - 1981: C with classes
- 在C語言的基礎上,開始了「帶類的C」的嘗試
- 這個階段的C++沒有被看作是一門新的編程語言,也沒有C++這個名字,只是一個更好的C
- 這個時期最重要的是引入了Simula語言的類和繼承的概念,使用Cpre預處理器實現
- 類
- class是一種類型擴展機制,可以讓程序員自定義數據類型
- 用戶自定義的數據類型和內置基本數據類型一樣,是語言的「第一等公民」
- 權限控制只有public和private,沒有protected
- 支持構造函數和析構函數
- 支持調用函數和返回函數
- 單繼承
- 內聯函數
- 友元類
- 函數參數類型檢查
- 函數默認參數
- 賦值運算符重載
- 支持new和delete運算符
- 改進了C中不友好的語法
- 函數形參的類型聲明
- 結構體變量的定義
- 類
- 早期的指導思想
- 與C語言兼容
- C的語言特性均可用
- 對象的內存布局和C結構體一致
- 使用和C一樣的鏈接模型
- 比C語言提供更高層的抽象機制
- 讓程序員更加容易表達設計意圖和組織更大規模的代碼
- 性能、可移植性要和C一樣好
- 不使用垃圾回收機制
- 實現語言特性的成本不能過高
- 與C語言兼容
1982 - 1985: Cfront 1.0
- 從1982年開始,C++開始定位作為一個新的編程語言,使用編譯技術重新實現了「帶類的C」,對應的編譯器為Cfront
- 1983年底,C++正式被命名
- Cfront的工作原理:將C++代碼先通過Cfront翻譯為C代碼,然后通過C編譯器進行編譯和鏈接
- 這個時期的C++語言特性和「C with classes」一致,主要支持面向過程、數據抽象的編程風格
- 1985年,Cfront 1.0發布
- 1985年,《The C++ Programming Language》第一版發布
1986 - 1989: Cfront 2.0
- 從1986年開始,C++開始引入一些重要的語言特性,讓C++明顯區別于C
- 虛函數
- 虛函數的引入,對C++意義重大
- 讓C++正式支持了面向對象的編程風格
- 讓程序員有了更強大的設計意圖表達工具
- 函數和運算符重載
- 引用
- const
- 類級的new和delete運算符重載
- 改進的靜態類型檢查
- 引入新的注釋
//
- 多重繼承
- protected訪問
- static靜態成員
- const成員
- 指向成員的指針
- 去掉調用函數和返回函數
- 1987年,C++ support in GCC 1.15.3
- 1989年,Cfront 2.0發布
- 虛函數
1990 - 1993: Cfront 3.0
- 1990年,《The Annotated C++ Reference Manual》發布
- 引入了C++高級特性,讓C++作為一個編程語言趨于完善
- 命名空間
- 異常
- 模板
- 讓C++支持了泛型編程風格
- 對標準庫STL的實現至關重要
- 嵌套類
- 1991年, Cfront 3.0發布
- 1991年,《The C++ Programming Language》第二版發布
- 1993年, Cfront退出了歷史舞臺
1998: C++98
- ISO/IEC 14882:1998
- C++標準委員會發布了C++語言的第一個國際標準
- 確定了C++的核心語言特性和標準庫STL
- 引入的新語言特性
- 運行時類型識別RTTI
- mutable
- bool
- declarations in conditions
- template instantiations
- member templates
- export
- 1998年,《The C++ Programming Language》第三版發布
2003: C++03
- ISO/IEC 14882:2003
- C++98的修訂版本
- 引入新的語言特性
- value initialization
2011: C++11
- ISO/IEC 14882:2011
- 正式邁進新時代:現代C++
- C++也進入了一個新的快速發展期,每3年發布一個版本
- 2013年,《The C++ Programming Language》第四版發布
- 引入了很多新的語言特性
- 類型推導: auto、decltype
- 右值引用和移動語義
- 變參模板
- std::function & std::bind & lambda表達式和后置返回值
- 智能指針
- c++11引入了三種智能指針:
- std::shared_ptr
- std::weak_ptr
- std::unique_ptr
- c++11引入了三種智能指針:
- constexpr
- static_assert
- 類機制完善
- 移動構造函數和賦值運算符重載函數
- 支持=default和=delete,完善編譯器自動生成函數的控制
- 支持explicit
- 委托構造
- 繼承構造
- 支持final,完善繼承
- 支持override,完善虛函數
- range-for(基于范圍的for循環)
- enum class
- nullptr
- 新增內置數據類型:long long、char16_t、char32_t
- 類內初始化
- 統一初始化
- using定義類型別名
- noexcept
- thread_local
- 列表初始化
- etc.
- 完善了標準庫STL
- 重新實現了STL的數據結構和算法
- 新增散列表和集合std::unordered_map、std::unordered_set
- 新增元組std::tuple、單向鏈表std::forward_list、數組std::array
- 移動函數std::move
- 完美轉發std::forward
- 智能指針std::unique_ptr、std::shared_ptr、std::weak_ptr
- 回調函數std::function、std::bind
- 多線程std::thread
- 多線程同步std::mutex、std::condition_variable、std::lock_guard、std::unique_lock
- 異步任務std::promise、std::future、std::packaged_task、std::async
- 原子操作std::atomic
- 時間函數std::chrono
- 初始化列表std::initialize_list
- 模板元編程type_traits
- 正則表達式std::regex
- 隨機數生成random
- etc.
2014: C++14
- ISO/IEC 14882:2014
- C++11的修訂版本
- 完善C++11的語言特性
- variable templates
- generic lambdas
- lambda init-capture
- new/delete elision
- relaxed restrictions on constexpr functions
- binary literals
- digit separators
- return type deduction for functions
- aggregate classes with default non-static member initializers.
- 完善標準庫STL
- std::make_unique
- std::shared_timed_mutex and std::shared_lock
- std::integer_sequence
- std::exchange
- std::quoted
- and many small improvements to existing library facilities, such as
- two-range overloads for some algorithms
- type alias versions of type traits
- user-defined literals for basic_string, duration and complex
- etc.
2017: C++17
- ISO/IEC 14882:2017
- 一個C++11的重要補充版本,引入了不少新的特性
- 構造函數模板推導
- 結構化綁定
- if-switch語句初始化
- 內聯變量
- 折疊表達式
- constexpr lambda表達式
- namespace嵌套
- __has_include預處理表達式
- 在lambda表達式用*this捕獲對象副本
- 新增Attribute
- 字符串轉換
- std::variant
- std::optional
- std::any
- std::apply
- std::make_from_tuple
- as_const
- std::string_view
- file_system
- std::shared_mutex
2020: C++20
- ISO/IEC 14882:2020
- 一個比肩C++11的重大版本
- 全新的語言特性,讓C++20看起來更加符合現代化的特征
- module
- 改變程序的組織方式
- 加快編譯速度
- concept
- 增強了模板的設計表達能力,讓模板更好用了
- 模板的錯誤提示變得友好
- 協程
- 應用級并發機制的支持
- 讓異步編程更方便
- range
- 更好地支持了函數式編程風格
- module
正在路上的C++23
- 完善標準庫STL,值得期待的4個功能
- 標準庫對于協程的支持(Library support for coroutines)
- 模塊化的標準庫(A modular standard library)
- Executors
- networking(基于ASIO)
參考
- 《C++語言的設計和演化》
- cppreference.com
- 走進編程:C++的發展歷程
- C++17新特性
- C++23的目標
- Welcome to Bjarne Stroustrup’s homepage!
- Evolving a language in and for the real world: C++ 1991-2006
- A History of C++: 1979? 1991