现代C++白皮书
读者序
之前没有好好的阅读过一本任何技术书籍,一般都是打开前几张,然后慢慢的失去耐心,所有造成的问题是一些书籍上的知识,只会对前面的章节有记忆,而大多数的书籍前面的章节也只是他书籍的入门介绍而已,所以我是个半吊子程序员,工作两年半之后,这个问题越来越困扰着我,有时候看见别人的面帖,感觉那些问题其实都因该是知道答案的,但是当我想要在脑海中把答案整理出来的时候却无从说起,简单的来说就是有的东西我是知道的,但是无法表示出来,不成体系,这给我一个错觉就是我感觉我能力可以,但是落到实地的时候却啥也做不了,脱离了谷歌百度或者其他我之前的资料,我啥都不行。
我个人觉得问题的解决方式是学会输出,把自己的知识整理输出,通过自己让别人知道一项新技能,新知识,那就代表自己其实已经有了闹靠的基础,知识的输出需要一个载体,我不是老师,公司也没有这个渠道,因为公司的知识交流与工作内容是密切相关的,所以这也是我搭建这个博客的原因,但愿我可以长期的坚持下去,说实话,之前已经有了还几次类似的经历,但是都半途而废了,我希望这是最后一次
前言
书籍是Bjarne Stroustup为HOPL所撰写的论文,目的是介绍c++在过去到现在的发展历程,以及其中一些大的功能点的演化。促发展上来划分C++可以分为两个阶段,一是C++98之前的类C版C++,二是之后的C++11之后的现代C++,在进40年的时间里C++还没有被取代,还可以在如此多的编程语言中占据一些之地,引用Bjarne Stroustup大佬的话说就是因为他填补了编程语言中一个重要的生态位。C++的核心是直接映射硬件和林开销抽象,
ISO 编程语言可以分为三种,一是有公司主导的编程语言,例如Google的go,C#以及苹果的swift等,二是由社区主导如php,python等,这两种在除了显而易见的好处之外的,都有各自的问题,公司主导的语言的,可能哎公司强势的时候还可以得到发展,但是公司没落之后,语言没有支持可能就无了,还有那家公司主导,那语言就是那家公司的产品,技术上的map由公司指定,小公司没有能力可以影响到语言的后续发展,对于社区,则可能会由于没有一个核心的个人或者组织来引导方向,导致语言偏离最初顶下的发展道路。Bjarne Stroustup就是基于以上的原因,提出组建一个标准委员会来引导C++ 的发展,
语言特性 具体的定义的语言的规则,有对应的具体的实现
1. 起源
C++核心特性
- 语言到设备之间的直接映射
- 零开销抽象
- 不使用的东西就不需要付出任何代价
- 使用到的东西就是可以实现的最好的
- 抽象具体为类,函数,模板,概念和别名
simula 最早的面向对象的语言,之后几乎所有的面向对象的语言都是直接或者间接的受奥他的印象。
C++最初是在1979年推出的,那时候是真正的带类的C。 Bjarne Stroustup的目的是想要一个可以直接映射硬件,同时又有类似于simula的具有抽象能力的语言,那是一个实验性质的语言的,实现就是把编码从C++逐行翻译到C,之后的1982年,随着人数的增加,他重写了前端,实现了一个功能完整的编译器,但是实际上在代码生成的是时候,还是生成的是C,
之后就是平稳的发展到推出98版本的C++,不考虑最近的一些新特性的话,我们大部分人的C++ 知识就到这里了。此时C++实现了
- 类
- 多态
- 运算符重载
- 类型安全连接
- 抽象类
- 模板 更好的泛型编程。大佬最初的时候使用宏实现的泛型编程
- 异常
- RAII
- *_cast
- bool
- STL标准库 上述就是最初的98的C++实现的功能点,实际上也是大多是C++的开发人员知道的最详细的C++知识。之后就是漫长过渡期,直到11版本的推出,使C++进入新时代,
- 06年单核处理器新能几乎不再提升,所以大部分应用开始寻找可以提升性能的编程语言,
C++11 新时代
许多新的特性的引入,使得C++类似一个新语言 特性如下
- 内存模型 高效的为现代硬件设计的底层抽象,描述并发的基础,
- auto|declytype
- range for 更好的遍历容器
- 移动语义和右值引用
- 统一初始化
- nullptrt
- constexpr
- 用户自定义字面量
- 原始字符串字面量
- 属性
- lambda表达式
- 变参模板
- 模板别名
- noexcept
- override和final
- static_assert
- longlong
- 默认成员初始化
- enum class
组件如下
- 智能指针 unique_ptr和shared_ptr
- atomic
- thread库
- future,promise等
- tuple
- type trait
- 正则
- 随机数
- 时间
- 容器
上面的东西就是后续C++在98 的基础上推出的新11功能点,在我自己写这边文档的时候,其实有些东西我是没概念的😂,这些看似不相关的东西,可以分为下面的几个大的主题
- 并发支持
- 简化使用
- 泛型编程的改进
- 增加静态类型的安全
- 支持对库的开发
- 标准库组件