大家都知道,在 C++中可以通过 typedef 重定义一个类型:
typedef unsigned int uint_t;
被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。
但是不能用于模版别名,所以C++11版本推荐,通过using来代替typedef
示例如下所示:
template<typename T> class Test { public: Test() { std::cout << "A " << typeid(T).name() << std::endl; } }; template <typename T> using Using_T = Test<T>; //template <typename T> //typedef Test<T> Typedef_T; //取消屏蔽后,这里将报错,不能用于模版别名,提示: a typedef cannot be a template int main(int argc, char *argv[]) { Test<int> a1; Using_T<int> a2; // C<int> a3; //这里会报错 return 0; }
除此之外,typedef还有个缺点,就是重定义函数指针时,会增加代码的阅读难度
比如:
typedef void (Typdf_ii)(int, int); //声明函数 typedef void (*PTypdf_ii)(int, int); //声明函数指针 typedef void (*PTypdf_iiArr[3])(int, int); //声明函数指针数组
对应的using用法则是:
using Using_ii = void (int, int); //声明函数指针 using PUsing_ii = void (*)(int, int); //声明函数指针 using PUsing_iiArr = void (*[3])(int, int); //声明函数指针数组
可以看到使用using, 通过赋值来定义别名,和我们平时使用变量类似,所以阅读比 typedef 更加清晰
示例如下所示:
#include <iostream> using namespace std; typedef void (Typdf_ii)(int, int); //声明函数 typedef void (*PTypdf_ii)(int, int); //声明函数指针 typedef void (*PTypdf_iiArr[3])(int, int); //声明函数指针数组 using Using_ii = void (int, int); //声明函数指针 using PUsing_ii = void (*)(int, int); //声明函数指针 using PUsing_iiArr = void (*[3])(int, int); //声明函数指针数组 void func1(int i, int j) { cout<<"func1:"<<i<<","<<j<<endl; } void func2(int i, int j) { cout<<"func2:"<<i<<","<<j<<endl; } void func3(int i, int j) { cout<<"func3:"<<i<<","<<j<<endl; } int main(int argc, char *argv[]) { PTypdf_iiArr pTypedf={func1,func2,func3}; PUsing_iiArr pUsing={func1,func2,func3}; pTypedf[0](1,2); //调用func1函数 pUsing[1](2,3); //调用func2函数 return 0; }
32.C++-11版本推荐使用using定义别名(替代typedef)虚函数之构造函数与析构函数分析
原文:https://www.cnblogs.com/lifexy/p/14098103.html