typedef关键字、using关键字

目录

1. typedef 的基本用法

2. typedef 与指针

3. typedef 与结构体

4. C++11 引入 using 作为 typedef 的替代

5. typedef 在模板中的限制

总结


typedef为某类型定义一个别名。当关键字typedef作为声明的基本类型出现时,声明中定义的名字就是类型名。 

C++11 及更早的标准中,typedef 关键字用于为已有类型定义别名。尽管 C++11 引入了 using 关键字作为更现代的类型别名定义方式,但 typedef 仍然有效。


1. typedef 的基本用法

#include <iostream>

// 定义类型别名
typedef unsigned int uint;

int main() {
    uint x = 42;  // uint 实际上是 unsigned int
    std::cout << x << std::endl;
    return 0;
}

解析

  • typedef unsigned int uint; 定义了 uint 作为 unsigned int 的别名。
  • 之后可以用 uint 代替 unsigned int 声明变量。

2. typedef 与指针

#include <iostream>

typedef int* IntPtr; // IntPtr 现在是 int* 的别名

int main() {
    int a = 10, b = 20;
    IntPtr p1 = &a, p2 = &b; // 等价于 int* p1, p2;
    
    std::cout << *p1 << ", " << *p2 << std::endl;
    return 0;
}

注意

  • IntPtr p1, p2; 实际上等价于:
    int* p1, p2; // p1 是指针,p2 是 int(⚠️ 容易误解)
    
  • 所以 typedef 定义指针类型时,建议每个变量单独声明

3. typedef 与结构体

在 C 语言中,定义结构体时通常会使用 typedef

#include <iostream>

typedef struct {
    int x;
    int y;
} Point; // Point 现在是 struct 的别名

int main() {
    Point p = {10, 20}; // 直接使用别名定义结构体变量
    std::cout << p.x << ", " << p.y << std::endl;
    return 0;
}

解析

  • typedef struct {...} Point;Point 作为结构体的类型别名,不必写 struct Point

4. C++11 引入 using 作为 typedef 的替代

C++11 引入 using 关键字,可以更简洁地定义类型别名:

using uint = unsigned int; // 等价于 typedef unsigned int uint;
using IntPtr = int*;       // 等价于 typedef int* IntPtr;

uint num = 42;
IntPtr ptr = &num;

推荐使用 using,因为:

  • using 更符合现代 C++ 语法,可读性更好。
  • using 支持模板别名typedef 不支持)。

5. typedef 在模板中的限制

typedef 不能 直接用于模板别名,而 using 可以:

// ❌ 错误:typedef 不能用于模板别名
template <typename T>
typedef std::vector<T> Vec; 

// ✅ 正确:using 可以用于模板别名
template <typename T>
using Vec = std::vector<T>;

Vec<int> v = {1, 2, 3}; // 等价于 std::vector<int> v

总结

特性typedefusing (C++11)
基本类型别名
指针类型别名
结构体别名
模板别名不支持支持
推荐使用❌(已被 using 替代)✅(C++11 及以后)

🚀 现代 C++ 推荐使用 using,因为它更简洁、支持模板,并且可读性更强!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值