枚举(enum) 是一种取值受限的特殊类型,具体的参考这里
enum Color{
Red, // 全局作用域
Green,
Yellow;
};
int main(){
Color x = Red;
}
关于枚举,我们需要知道以下几点:
- 分为无作用域枚举与有作用域枚举( C++11 起)两种
enum class Color{ Red, // 有作用域枚举 Green, Yellow; }; int main(){ Color x = Color::Red; } - 枚举项缺省使用 0 初始化,依次递增,可以使用常量表达式来修改缺省值
- 可以为枚举指定底层类型,表明了枚举项的尺寸
enum Color : char // 默认为int { Red, Green, Yellow; }; - 无作用域枚举项可隐式转换为整数值;也可用 static_cast 在枚举项与整数值间转换
enum class Color : char { Red, Green, Yellow }; int main(){ Color x = static_cast(0); } - 注意区分枚举的定义与声明
enum class Color : int; // 声明 enum class Color // 定义 { Red, Green, Yellow };
联合( union )用于将多个类型合并到一起以节省空间,关于联合我们需要注意以下几点:
- 通常与枚举一起使用
enum Type{ // 用于区分联合中当前使用的变量 Int, Char }; union Str{ char x; int y; }; struct S{ Type t; Str obj; }; int main(){ S s; s.t = Char; s.obj.x = 'c'; } - 匿名联合
struct S{ enum Type{ Int, Char }; union { char x; int y; }; Type t; }; int main(){ S s; s.t = S::Char; s.x = 'c'; } - 在联合中包含非内建类型( C++11 起)
嵌套类是在类中定义的类,关于嵌套类我们需要注意以下几点:
- 嵌套类具有自己的域,与外围类的域形成嵌套关系,嵌套类中的名称查找失败时会在其外围类中继续查找
- 嵌套类与外围类单独拥有各自的成员(非静态成员)
局部类是在函数内部定义的类,关于局部类我们需要注意以下几点:
- 可以访问外围函数中定义的类型声明、静态对象与枚举
- 局部类可以定义成员函数,但成员函数的定义必须位于类内部
- 局部类不能定义静态数据成员
关于嵌套名字空间,我们应该注意以下几点:
- 名字空间可以嵌套,嵌套名字空间形成嵌套域
namespace Out { namespace In{ } } - 注意同样的名字空间定义可以出现在程序多处,以向同一个名字空间中增加声明或定义
- C++17 开始可以简化嵌套名字空间的定义
namespace Out { } namespace Out::In{ }
关于匿名名字空间,我们需要注意以下几点:
- 可用于构造仅翻译单元可见的对象
- 可用 static 代替
- 可作为嵌套名字空间
位域用来显式表明对象尺寸(所占位数),具体的参考这里
struct A{
bool b1 : 1;
bool b2 : 1;
};
关于位域,我们需要注意以下几点:
- 在结构体 / 类中使用
- 多个位域对象可能会被打包存取
- 声明了位域的对象无法取地址,因此不能使用指针或非常量引用进行绑定
- 尺寸通常会小于对象类型所对应的尺寸,否则取值受类型限制
volatile关键字的具体使用参考这里,关于volatile关键字,我们需要注意以下几点:
- 表明一个对象的可能会被当前程序以外的逻辑修改
- 相应对象的读写可能会加重程序负担
- 注意慎重使用 一 —— 些情况下可以用 atomic 代替



