14 数据类型的别名
1 概述
我们学过了使用 “引用” 来作为变量别名的方法。那么,大家有没有想过,不只是 “变量” ,在 C++ 中, “数据类型” 也是可以起别名的呢?
我们为什么需要给数据类型起别名呢?
- 使类型名写起来更方便。
我们总会遇到一些特别长的数据类型名,如果我们直接用,写起来很麻烦。如:std::ios_base::fmtflags
- 编写跨平台代码。
在不同硬件和操作系统中,一个功能类似的数据类型,它们的名字可能不同,这时就可以给它们起一个相同的名字,使我们的代码,可以在不同平台运行。 - 使数据类型名,更具与可读性。
有些已有数据类型的名字,让人不能一眼看出它是干什么的,这时,我们需要给它起个更容易理解的名字。
但是,我们最好不要随便给数据类型起别名。 比如,把 int 起个别名,叫做你的名字,这样肯定是不合适的,这会使程序变得难以理解。
2 起别名的两种方式
typedef
C++03 标准中引入的起别名方式。using
C++11 标准中引入的起别名方式。比typedef
更容易理解,而且用途更广泛(可以给模板起别名),因此更推荐使用。
3 使用示例
以下代码需要假设已有一个叫做 student
的结构体类型。
- 给
student
类型起别名,叫做stu
。
using stu = student;
// 或者使用 typedef
typedef student stu;
- 给
student
类型的指针起别名,叫做stu
。
using stu = student*;
// 或者使用 typedef
typedef student * stu;
- 给
student
类型的引用起别名,叫做stu
。
using stu = student&;
// 或者使用 typedef
typedef student &stu;
- 综合练习
#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;