一、C++ 中的类型别名和 using 声明的概念
类型别名(typedef)
类型别名是 C++ 中用于为现有类型创建一个新的名字的机制。在早期的 C 和 C++ 编程中,主要是通过typedef关键字来实现的。例如,如果你有一个比较复杂的类型,如unsigned long long int,你可以为它创建一个更简洁的别名。
示例:
typedef unsigned long long int ullong;
这里ullong就成为了unsigned long long int的别名。之后你就可以像使用原始类型一样使用这个别名来声明变量,比如ullong num = 1234567890123;。
using 声明(using)
using声明在 C++ 中有多种用途,其中一个重要的用途是创建类型别名。它是 C++11 引入的一种更灵活的方式来创建类型别名。与typedef相比,using在某些复杂类型别名的定义上更加直观。
示例:
using ullong = unsigned long long int;
这和上面typedef的例子效果是一样的,都是为unsigned long long int创建了一个名为ullong的别名。不过using声明在模板别名等更复杂的场景下有更好的表现力。
二、如何使用类型别名和 using 声明
类型别名(typedef)的使用场景和方式
简化复杂类型:
当处理函数指针类型时,typedef非常有用。例如,有一个函数指针类型,它指向的函数接受两个int参数并返回一个double类型的值。可以这样定义类型别名:
typedef double(*func_ptr)(int, int);
- 然后可以使用这个别名来声明函数指针变量。例如,假设有一个函数
double add(int a, int b) { return a + b; }
,可以这样声明一个指向这个函数的指针:
func_ptr ptr = add;
- 定义结构体别名:
- 对于结构体类型,也可以使用
typedef
来创建别名。例如:
- 对于结构体类型,也可以使用
typedef struct {
int x;
int y;
} Point;
- 之后就可以像使用普通类型一样使用
Point
来声明变量,如Point p; p.x = 1; p.y = 2;
。 - using 声明的使用场景和方式
- 简单类型别名:
- 和
typedef
类似,用于基本类型的别名定义。例如:
- 和
- 简单类型别名:
using MyInt = int;
MyInt num = 10;
- 模板别名(这是 using 相对于 typedef 的优势场景):
- 在模板编程中,
using
声明可以更方便地定义模板别名。例如,考虑一个简单的模板类template <typename T> class MyVector {... };
,如果要为这个模板类的特定实例(比如MyVector<int>
)创建一个别名,可以使用using
声明:
- 在模板编程中,
using IntVector = MyVector<int>;
IntVector v;