1. typedef 语法
typedef是C语言遗留的起别名语法,作用是给已有类型起一个别名,不是创造新类型,仅仅是别名
语法格式:typedef 原类型 别名;
#include <iostream>
#include <vector>
// 给int起别名
typedef int MyInt;
MyInt a = 10; //等价于 int a = 10;
//给容器迭代器起别名
typedef std::vector<int>::iterator VecIt;
std::vector<int> v{1,2,3};
VecIt it = v.begin();
- typedef函数指针别名
// 原类型:返回值int,两个int参数的函数指针 int(*)(int,int)
typedef int(*FuncPtr)(int, int);
int add(int a,int b){
return a + b;
}
int main()
{
FuncPtr fp = add;
cout << fp(1,2) << endl;
return 0;
}
可读性差,括号多
- typedef 和const
typedef int* PtrInt;
int x = 100;
const PtrInt p = &x;
//等价于 int *const p = &x; 指针本身const,指针指向内容可以修改
//不是 const int* p!!!
*p = 200; //ok
// p = nullptr; //错误,指针本身不可修改
2. c++11 using 别名声明
using别名语法更加直观:别名写在等号左边,原始类型放右边。语法:using 别名=原类型;
using MyInt = int;
//迭代器别名
using VecIt = vector<int>::iterator;
//函数指针别名,可读性优于typedef
using FuncPtr = int(*)(int,int);
using和const组合,和typedef等价
3. using 支持模板别名,typedef 不行
typedef不能直接给模板起别名;using可以实现模板别名。
// using 模板别名
template<typename T>
using Vec = vector<T>;
Vec<int> v1; // vector<int>
Vec<string> v2; // vector<string>
如果使用 typedef,只能包一层结构体迂回实现:
template<typename T>
struct VecWrap
{
typedef vector<T> type;
};
VecWrap<int>::type v; //等价vector<int>,写起来繁琐
4. typedef vs using
| 特性 | typedef | using (C++11 别名) |
|---|---|---|
| 起源 | C 语言,兼容 C++ | C++11 新增 |
| 语法形式 | typedef 原类型 别名; | using 别名 = 原类型; |
| 普通类型别名 | 支持 | 支持 |
| 函数指针别名 | 支持,语法晦涩 | 支持,阅读直观 |
| 模板别名 | 不直接支持,需要套 struct | 原生直接支持模板别名 |
| const 修饰行为 | 完全一致 | 完全一致 |
| 是否产生新类型 | 都只是别名,没有创建新类型 | 都只是别名,没有创建新类型 |
5. 一个坑
- using namespace std; 指令:名字空间导入
- using A = B; 类型别名声明
浙公网安备 33010602011771号