C++学习笔记——typedef和using
typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。需要注意的是typedef并没有创建新的类型,只是指定了一个类型的别名而已。typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。
C++11 中扩展了using的使用场景(C++11之前using主要用来引入命名空间名字 如:using namespace std;),可以使用using定义类型的别名:
使用语法如下:
using 别名 = xxx(类型);
通过语法可以看出,using声明别名的顺序和typedef是正好相反:typedef首先是类型,接着是别名,而using使用别名作为左侧的参数,之后才是右侧的类型,例如上面的类型定义:
typedef int points;
using points = int; //等价的写法
示例
using FinalLightStatusPtr = std::shared_ptr<FinalLightStatus>;
typedef std::shared_ptr<FinalLightStatus> FinalLightStatusPtr;
这两个语句分别使用了using和typedef来创建类型别名。
using FinalLightStatusPtr = std::shared_ptr<FinalLightStatus>;
这个语句使用了C++11引入的using关键字来创建类型别名,本质上是为std::shared_ptr<FinalLightStatus>
这个类型取了一个新的名字FinalLightStatusPtr。这种方法在C++11及以上的标准中被广泛使用,更加清晰易懂。
typedef std::shared_ptr<FinalLightStatus> FinalLightStatusPtr;:
这个语句使用了typedef关键字来创建类型别名。这种方法是C++早期就存在的一种类型别名的声明方式。
这两种方式在功能上是相同的,都是用来创建类型别名。它们的区别在于using更加清晰,并且更容易泛化,可读性更好。而typedef是C++早期的语法,对于较复杂的别名声明会比较繁琐。
因此,using更容易推荐使用,特别是在现代C++标准中。对于适用场景,using和typedef在功能上是等价的。常见的场景包括为复杂类型或模板类型创建简单易懂的别名,使代码更易读,更易维护。
区别
当在C++中需要创建类型别名时,可以使用using
和typedef
两种方式。
using:
-
使用方法:
- 使用
using
关键字来创建类型别名。语法为using 新类型名 = 原类型;
。可以用于创建简单类型别名、模板类型别名、函数指针别名等。
- 使用
-
示例:
#include <iostream> #include <vector> // 创建一个类型别名TLInfos,用于表示std::vector<int>类型 using TLInfos = std::vector<int>; int main() { TLInfos v = {1, 2, 3}; for (auto i : v) { std::cout << i << " "; } return 0; }
-
优点:
- 在创建模板别名时更为灵活,可用于模板类型的别名声明。
- 可以使用
auto
进行类型推导辅助简化复杂类型的声明。 - 更加直观和清晰,可读性更好。
-
缺点:
- 需要C++11及以上标准支持。
typedef:
-
使用方法:
- 使用
typedef
关键字来创建类型别名。语法为typedef 原类型 新类型名;
。主要用于创建简单类型别名,无法创建模板类型别名。
- 使用
-
示例:
#include <iostream> // 创建一个类型别名FinalLightStatusPtr,用于表示std::shared_ptr<int>类型 typedef std::shared_ptr<int> FinalLightStatusPtr; int main() { FinalLightStatusPtr ptr(new int(5)); std::cout << *ptr << std::endl; return 0; }
-
优点:
- 兼容各种C++标准,支持在较旧的代码中使用。
- 在较早的C++标准中更为常见,程序员更习惯使用。
-
缺点:
- 对于复杂的类型别名声明,使用
typedef
语法较为繁琐,可读性较差。 - 不能用于创建模板类型别名。
- 对于复杂的类型别名声明,使用
总结:
using
更为灵活,在现代C++中更受推荐,特别是在需要创建模板类型别名的情况下。typedef
在兼容较旧代码、较旧C++标准的情况下仍然有其价值,但对于现代C++来说,using
更适用。