14 数据类型的别名

1 概述

我们学过了使用 “引用” 来作为变量别名的方法。那么,大家有没有想过,不只是 “变量” ,在 C++ 中, “数据类型” 也是可以起别名的呢?

我们为什么需要给数据类型起别名呢?

  1. 使类型名写起来更方便。
    我们总会遇到一些特别长的数据类型名,如果我们直接用,写起来很麻烦。如: std::ios_base::fmtflags
  2. 编写跨平台代码。
    在不同硬件和操作系统中,一个功能类似的数据类型,它们的名字可能不同,这时就可以给它们起一个相同的名字,使我们的代码,可以在不同平台运行。
  3. 使数据类型名,更具与可读性。
    有些已有数据类型的名字,让人不能一眼看出它是干什么的,这时,我们需要给它起个更容易理解的名字。

但是,我们最好不要随便给数据类型起别名。 比如,把 int 起个别名,叫做你的名字,这样肯定是不合适的,这会使程序变得难以理解。

2 起别名的两种方式

  1. typedef
    C++03 标准中引入的起别名方式。
  2. using
    C++11 标准中引入的起别名方式。比 typedef 更容易理解,而且用途更广泛(可以给模板起别名),因此更推荐使用。

3 使用示例

以下代码需要假设已有一个叫做 student 的结构体类型。

  1. student 类型起别名,叫做 stu
using stu = student;
// 或者使用 typedef
typedef student stu;
  1. student 类型的指针起别名,叫做 stu
using stu = student*;
// 或者使用 typedef
typedef student * stu;
  1. student 类型的引用起别名,叫做 stu
using stu = student&;
// 或者使用 typedef
typedef student &stu;
  1. 综合练习
#include<iostream>
using namespace std;

struct student {string name;};

int main() {
    using stu1 = student;
    using stu2 = student*;
    using stu3 = student&;

    stu1 s1 = {"张三"};
    stu2 s2 = &s1;
    stu3 s3 = s1;

    cout << s1.name << endl;
    cout << s2 -> name << endl;
    cout << s3.name << endl;

    return 0;
}

4 拓展 · 函数指针别名

这两种方式也可以用于给函数指针起别名。这时,可以明显看出 using 可读性更好。

// 使用 using
using func = void(*)(int);

// 使用 typedef
// typedef void (*func)(int);

// func 是我们为返回值为 void 类型,需要一个 int 类型参数的函数指针声明的数据类型
void actual_function(int arg) { /* some code */ }
func fptr = &actual_function;