当前位置: 首页 > article >正文

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++中需要创建类型别名时,可以使用usingtypedef两种方式。

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更适用。

http://www.kler.cn/news/234529.html

相关文章:

  • 【机器学习300问】23、什么是主动学习?
  • 基于Java实现Socket文件传输代码详解
  • 算法学习系列(三十二):背包问题
  • 笔记——asp.net core 中的 REST
  • 【iOS操作系统——讲解】
  • leetcode-206-翻转链表
  • 【Jenkins】Jenkins关闭Jenkins关闭、重启
  • LeetCode---383周赛
  • 学了很多知识,没多久就忘光了,怎么办?
  • 力扣刷题之旅:进阶篇(六)—— 图论与最短路径问题
  • 网络的基本概念和socket编程
  • java 类加载过程
  • Vulnhub靶机:hacksudo-search
  • Java实现数据可视化的智慧河南大屏 JAVA+Vue+SpringBoot+MySQL
  • 踩坑实录(Second Day)
  • 789. 数的范围(二分模板)
  • ShardingSphere实现openGauss分布式架构
  • 夜天之书 #95 GreptimeDB 社群观察报告
  • 零代码3D可视化快速开发平台
  • 【射影几何15】python双曲几何工具geometry_tools
  • 【Opencv学习】04-图像加法
  • QGIS编译(跨平台编译)之四十九:cairo编译(Windows、Linux、MacOS环境下编译)
  • 基于springboot会员制医疗预约服务管理信息系统源码和论文
  • vue3学习——router-view 过渡动画
  • visual studio code could not establish connection to *: XHR failed
  • GreenSock Animation Platform(GSAP)动画库插件介绍
  • [C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表
  • Nginx配置php留档
  • C++ bool 布尔类型
  • opencv 图像色彩空间转化