📘 C++ 中 using 关键字的用法详解
在 C++ 中,using 关键字功能强大且用途多样,从 C++11 开始更是得到了显著增强。它主要用于简化代码、提高可读性、解决继承中的函数隐藏问题等。以下是 using 在 C++ 中的主要用法详解:
1️⃣ 引入命名空间成员(Namespace Members)
1.1 引入单个成员
1  | 
  | 
✅ 推荐:比
using namespace std;更安全,避免命名污染。
1.2 引入整个命名空间(谨慎使用)
1  | using namespace std;  | 
⚠️ 警告:不要在头文件或大型项目中使用,容易引起命名冲突!
2️⃣ 定义类型别名(Type Alias)— 替代 typedef
C++11 起,using 可用于定义类型别名,语法更直观,功能更强。
2.1 基本类型别名
1  | using IntPtr = int*;  | 
等价于:
1  | typedef int* IntPtr;  | 
✅
using语法更符合“赋值”语义:别名 = 原类型
2.2 模板别名(typedef 无法做到!)
1  | template<typename T>  | 
🌟 这是
using最强大的优势之一 —— 支持模板别名!
3️⃣ 在派生类中引入基类成员(解决函数隐藏)
当派生类定义了与基类同名的函数时,基类所有重载版本都会被隐藏。使用 using 可显式引入。
1  | class Base {  | 
❌ 如果没有
using Base::func;,则d.func(10)会报错 —— 因为基类函数被隐藏了!
4️⃣ 改变继承成员的访问权限(C++11)
在派生类中,可以用 using 提升或改变从基类继承的成员的访问级别。
1  | class Base {  | 
📌 注意:不能用
using降低访问权限(比如 public → private),只能提升或保持。
5️⃣ 在模板中引入依赖基类成员(解决编译错误)
在模板派生类中访问基类成员时,有时编译器无法识别,需用 using 或 this-> 显式声明。
1  | template<typename T>  | 
💡 原因:在模板中,基类是依赖名称(dependent name),编译器默认不查找基类作用域。
📋 总结:using 的五大用途
| 用途 | 示例 | 说明 | 
|---|---|---|
| 1️⃣ 引入命名空间成员 | using std::cout; | 
避免写 std::,更安全 | 
| 2️⃣ 定义类型别名 | using IntVec = std::vector<int>; | 
替代 typedef,支持模板 | 
| 3️⃣ 引入基类函数 | using Base::func; | 
解决派生类函数隐藏问题 | 
| 4️⃣ 改变访问权限 | using Base::func;(在 public 下) | 
提升继承成员访问级别 | 
| 5️⃣ 模板中引入基类成员 | using Base<T>::member; | 
解决依赖名称查找问题 | 
💡 最佳实践建议
- ✅ 优先使用 
using定义类型别名(特别是模板别名) - ✅ 在类中使用 
using解决函数重载隐藏问题 - ✅ 在 
.cpp文件中局部使用using namespace xxx;,避免在头文件中使用 - ✅ 在模板派生类中,对基类成员使用 
using或this->避免编译错误 - ❌ 不要用 
using降低访问权限(语法不允许) 
🧠 小测验
下面代码能否编译通过?
1  | class A {  | 
❌ 编译错误!
A::foo(int)被B::foo(double)隐藏了。
✅ 解决方案:在B中添加using A::foo;
- 本文作者: 迪丽惹Bug
 - 本文链接: https://lyroom.github.io/2025/09/22/C-朝花夕拾-using关键字/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!