大圣
发布于 2023-11-12 / 57 阅读 / 1 评论 / 1 点赞

C++之旅(二)

之前学习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要好得多。

本章建议

  1. 内置类型过于底层时,使用自定义的类。
  2. 将有关联的数据组合成struct或class。
  3. 用class表达接口和实现的区别(public与private)
  4. 一个struct就是成员为public的class
  5. 定义构造函数可保证和简化class的初始化。
  6. 用枚举表示一组命名的常量(如状态,协议)
  7. 优先使用enum class来保证安全。
  8. 为枚举定义操作来保证安全和便捷(如++运算符重载)
  9. 避免使用裸union,将其与表示类型的项一起封装到一个类里更好。
  10. 优先使用std::variant而不是union
    **## **

评论