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 这个类型取了一个新的名字FinalLightStatusPtr。这种方法在C++11及以上的标准中被广泛使用,更加清晰易懂。

typedef std::shared_ptr<FinalLightStatus> FinalLightStatusPtr;:

这个语句使用了typedef关键字来创建类型别名。这种方法是C++早期就存在的一种类型别名的声明方式。

这两种方式在功能上是相同的,都是用来创建类型别名。它们的区别在于using更加清晰,并且更容易泛化,可读性更好。而typedef是C++早期的语法,对于较复杂的别名声明会比较繁琐。

因此,using更容易推荐使用,特别是在现代C++标准中。对于适用场景,using和typedef在功能上是等价的。常见的场景包括为复杂类型或模板类型创建简单易懂的别名,使代码更易读,更易维护。

区别

当在C++中需要创建类型别名时,可以使用usingtypedef两种方式。

using:

  • 使用方法:

    • 使用using关键字来创建类型别名。语法为 using 新类型名 = 原类型;。可以用于创建简单类型别名、模板类型别名、函数指针别名等。
  • 示例:

    #include 
    #include 
    
    // 创建一个类型别名TLInfos,用于表示std::vector类型
    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 
    
    // 创建一个类型别名FinalLightStatusPtr,用于表示std::shared_ptr类型
    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更适用。

你可能感兴趣的:(C++,c++,学习,笔记)