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; 类型别名声明