之前学习c++都是来源博客和一些教材,某种程度来说有很多的总结,经验之谈。虽然能够使我们快速的理解和应用,但是作为一个学习者来说,至少对于我来说,很多知识都像是“规定”,我不知道为什么要这么做,只是别人告诉我应该这么做,有点知其然不知其所以然的感觉。我在阅读了这本书一部分之后,才明白C++中很多特性,及前文我说的”规定“的设计思路,有一种豁然开朗的感觉。同时了解了c++一路走来的历程,也有助于更好的理解应用c++的语法技巧。接下来我会将一些新的感悟记录在下文,相信这是一本值得一读的书。
二.用户自定义类型
C++中的基本类型有意设计的偏底层,因为能够直接高效的反应计算机硬件能力。是的,c++从一开始的设计核心就是接近底层以提高效率,也正是目前其自身的巨大优势。
我们可以使用struct或class组织一些结构,来为我们使用。struct与class没有本质区别,只不过struct成员默认为public的。他们都可以声明public和private的成员,public通常用于提供接口,而private成员通过接口访问,以保证封装性。
vector和string都是出色的功能类,不要尝试自己实现,使用现有的是最好的选择。
枚举
枚举用来罗列一些商定好的值。用于代替“魔数”,以实现更好的可读性和方便记忆。
所以枚举其中的值都是整数类型。
枚举分为两种,一种是enum class,一种是enum。
- enum class 表示强类型,枚举的作用域只在其内部有效,所以可以不同枚举下的枚举值取相同的名字。用的时候都会加上命名空间,不会混淆。可以定义自定义操作,同时其不能发生隐式转换,必须显式转换,如:
enum class Color{red,green,yellow};
int i = Color::red; //错误,隐式转换
Color c = 2; //错误,隐式转换
Color x = Color{3}; //正确,显示转换
int i = int(Color::red); //正确,显示转换
- enum 表示普通的枚举,这样其中的名字整数的“别名”,即可以随时调用和转换。
联合体
union中的成员同一时间只会有一个使用,它所有的成员都指向同一个地址,取决于你怎么用它。这么设计通常为了节省内存,但裸union的方式很少被用到。因为可以将类型和其封装成一个新的类,这样更安全。
或者使用标准库中的variant,qt中也有自己的qvaraint,这都是成熟的封装工具类,安全,比直接使用union要好得多。
本章建议
- 内置类型过于底层时,使用自定义的类。
- 将有关联的数据组合成struct或class。
- 用class表达接口和实现的区别(public与private)
- 一个struct就是成员为public的class
- 定义构造函数可保证和简化class的初始化。
- 用枚举表示一组命名的常量(如状态,协议)
- 优先使用enum class来保证安全。
- 为枚举定义操作来保证安全和便捷(如++运算符重载)
- 避免使用裸union,将其与表示类型的项一起封装到一个类里更好。
- 优先使用std::variant而不是union
**## **