【c++八股文】Day6:using和typedef
using
是 C++ 中非常重要且用途广泛的关键字,它的作用取决于使用场景,可以分为以下几大类:
✅ 一、using
的五大常见用途(你要重点掌握)
类别 | 示例 | 作用描述 |
---|---|---|
1️⃣ 类型别名(替代 typedef) | using i64 = long long; | 定义类型别名(比 typedef 更现代) |
2️⃣ 继承成员暴露 | using Base::foo; | 把父类的同名函数或变量“引入”子类作用域 |
3️⃣ 模板别名 | using Vec = std::vector<T> | 为模板定义别名 |
4️⃣ 命名空间引入 | using std::cout; | 把命名空间中的名字引入当前作用域 |
5️⃣ 别名模板(C++11 起) | template <typename T> using Ptr = T*; | 模板别名(不能用 typedef 实现) |
📘 1. 类型别名(最常用)
✅ 写法:
using i64 = long long; // 等价于 typedef long long i64;
✅ 现代 C++ 推荐使用 using
而非 typedef
,因为:
using
更直观(左边是新名字)- 支持模板别名(
typedef
不支持)
📘 2. 继承中引入父类成员(名字提升)
class Base {
public:void foo(int);
};class Derived : public Base {
public:using Base::foo; // 否则会被隐藏void foo(double);
};
❗ 否则父类的 foo(int)
会被子类的 foo(double)
隐藏(名字隐藏规则)
📘 3. 模板类型别名(typedef
做不到)
template<typename T>
using Vec = std::vector<T>; // 这样就可以写 Vec<int> 了Vec<int> a = {1, 2, 3};
这个是
using
相较于typedef
最大的优势
📘 4. 引入命名空间中的符号(慎用)
using std::cout;
using std::endl;cout << "hello" << endl;
或者引入整个命名空间(⚠️面试中要小心):
using namespace std; // 不推荐写在头文件中
📘 5. 别名模板函数指针、指针封装器等(高级用法)
template<typename T>
using Ptr = T*;Ptr<int> p = new int(5); // 相当于 int* p
这是 typedef
无法实现的模板别名写法。
✅ 面试中推荐的表达方式
using
是现代 C++ 提供的统一机制,用于类型别名、命名引入、继承成员提升、模板别名等场景,相较于typedef
,它语义更清晰、功能更强,尤其是在模板编程中更具优势,是 C++11 之后推荐的写法。