基本概念
在 C++ 中,类的继承和嵌套类的定义是两种不同的概念。
class InitialSetupProcedure : public StateMachine //类的继承(符号是":")
class InitialSetupProcedure::StateMachine //类的嵌套(符号是"::",意思是类StateMachine嵌套在InitialSetupProcedure类中)
这两个类,一个是继承自 StateMachine
的类,另一个是嵌套在 InitialSetupProcedure
类中的 StateMachine
类。让我们详细解释这两种情况。
- 继承自
StateMachine
的类
假设有一个基类StateMachine
,然后你定义了一个类InitialSetupProcedure
继承自StateMachine
:
class StateMachine {
// 基类 StateMachine 的定义
};
class InitialSetupProcedure : public StateMachine {
// InitialSetupProcedure 类的定义
};
在这种情况下,InitialSetupProcedure
继承了 StateMachine
的所有成员和方法。
- 嵌套类
StateMachine
嵌套类是定义在另一个类内部的类。在你的例子中,InitialSetupProcedure
类中嵌套了一个StateMachine
类:
class InitialSetupProcedure {
public:
class StateMachine {
// 嵌套类 StateMachine 的定义
};
// InitialSetupProcedure 类的其他成员和方法
};
在这种情况下,StateMachine
是 InitialSetupProcedure
类的一个成员类,它的作用域被限制在 InitialSetupProcedure
类的内部。
这两个类名一样会冲突吗?
这两种情况可以同时存在,因为它们在不同的作用域中。一个是全局作用域中的基类 StateMachine
,另一个是 InitialSetupProcedure
类中的嵌套类 StateMachine
。它们的定义和用途是独立的。
还有个比较类似的:
enum class State : uint8_t
在 C++11 及其后续版本中,引入了 enum class
(也称为 “scoped enumeration”),它与传统的 enum
有一些重要的区别和优势。
主要原因和好处
- 作用域控制:
enum class
定义的枚举类型是强作用域的。这意味着枚举成员不会自动提升到外部作用域,必须通过枚举类型名称进行访问。
例如,State::idle
而不是 idle
。这可以避免命名冲突。
- 类型安全:
enum class
提供了更强的类型安全性。枚举值不会隐式转换为整数或其他类型,必须显式转换。这可以防止意外的类型错误。
例如,不能将 State::idle
直接赋值给一个整数变量,必须进行显式转换。
- 底层类型指定:
enum class
允许指定底层类型(如 uint8_t
),从而控制枚举的存储大小。这在需要优化内存使用时非常有用。
在例子中,State 的底层类型被指定为 uint8_t
,这意味着每个枚举值将占用 1 个字节。