Skip to content

关键字

typedef

用于给已有类型取别名,typedef关键字后可能接一长段,遵循正常声明变量声明的语法,变量的名字即为别名,例如:

1
2
3
4
5
6
7
 //声明一个长度为3的float数组类型,别名为point3
typedef float point3[3];   
point3 p;     //创建一个长度为3的float数组p

//声明一个别名为point的整型
typedef int point;
point p;

存在以下特别的情况:

  • 结构体

    结构体本身就是自定义类型,在C++中可以像用别名一样直接用结构体名创建对象,为结构体取别名通常是为了兼容老代码(在C中,创建结构体对象必须用struct+结构体名作为类型名),且和声明语法有所区别:

    //声明一个别为PointSet的结构体
    typedef struct point{int x;int y;}PointSet;
    
  • 不必像简单的数据结构一样把类定义写在typedef后,在完整的类定义后使用typedef+类名+别名即可。

    1
    2
    3
    4
    5
    class RenderWindowSystem{...}
    typedef RenderWindowSystem Window;
    
    //声明对象
    Window myWin;
    

Union

联合体,允许在同一段内存中存储不同的数据类型中的一种,其长度是所有允许类型中最长的长度。

它有以下特点:

  • 本质是一个结构体
  • 它的左右成员相对于基地址的偏移量都是0
  • 此结构的空间需要足够容纳最长的成员
  • 内存对齐方式需要适用于所有成员

=default

显式地使用默认构造方法。

默认情况下,如果一个类包含包含带参构造函数,则默认生成的无参构造函数会被隐藏且无法被调用。此时如果想让该无参构造函数变为可用,则需要使用=default显式声明,例如:

class Sandbox {
public:
    Sandbox(int width, int height) {}

    //默认情况下,自动生成的无参构造函数不再能被调用
    //使用 =default 强行让编译器生成默认的无参构造函数
    Sandbox() = default; 
};

int main() {
    Sandbox s1;       
    Sandbox s2(10, 20);
}

=delete

显式地禁用指定方法被调用。

常用于禁止类被拷贝和赋值,例如:

class UniqueResourceManager {
public:
    UniqueResourceManager() = default;

    // 显式禁用拷贝构造函数
    UniqueResourceManager(const UniqueResourceManager&) = delete;

    // 显式禁用赋值运算符
    UniqueResourceManager& operator=(const UniqueResourceManager&) = delete;
};

int main() {
    UniqueResourceManager res1;
    UniqueResourceManager res2 = res1; //编译会在此处报错,显示方法已被删除
}

类型转换

reinterpret_cast\(expr)

强制类型转换,将一个类型的指针转换为另一个类型的指针。这一方法并不改变指针本身的类型,仅生成一个临时的匿名对象,使仅接受特定类型指针的方法可以接收该指针。例如:

ThrowIfFailed(m_passCB->Map(0, nullptr, reinterpret_cast<void**>(&mp_passCBMapped)));

Map方法仅接受一个指向空类型的指针的地址,而mp_passCBMapped是一个UINT*类型的指针,因此此处需要使Map方法认为&mp_passCBMapped是一个void**类型的实例。但mp_passCBMapped本身不因为reinterpret_cast发生任何变化。

const_cast\(expr)

转换对象的const属性。

static_cast\ (expr)

dynamic_cast\ (expr)