C++ 知识点01 命名空间(Namespace)
C++ 命名空间(Namespace)
一、什么是命名空间?为什么要用?
命名空间 = 给代码 “加个文件夹 / 标签”
作用:解决名字冲突,让不同地方的同名函数、变量、类可以共存,不打架。
比如:
你写了一个
print()别人的库也有一个
print()编译器会懵:到底用哪个?用命名空间分开,就不会冲突了。
二、基础语法
1. 定义命名空间
namespace 名字 { // 变量、函数、类都可以放这里 }2. 使用命名空间里的内容
有 3 种用法(从推荐到不推荐):
指定全名(最安全):
命名空间::成员using 声明:
using 命名空间::成员;using 编译指令:
using namespace 命名空间;(容易冲突,少用)
三、完整代码 + 逐行讲解
示例 1:最基础用法(定义 + 使用)
#include <iostream> using namespace std; // 先暂时用标准库命名空间,方便输出 // 定义一个命名空间:mySpace namespace mySpace { // 命名空间里的变量 int num = 100; // 命名空间里的函数 void show() { cout << "我在 mySpace 里!num = " << num << endl; } } // 主函数 int main() { // 用法1:使用 命名空间::成员 (最推荐!) mySpace::show(); // 修改变量 mySpace::num = 200; cout << "修改后:" << mySpace::num << endl; return 0; }运行结果:
我在 mySpace 里!num = 100 修改后:200关键点:
::叫作用域解析符,意思是 “用这个命名空间里的东西”。这种写法绝对不会冲突,大型项目首选。
示例 2:名字冲突(命名空间的核心用途)
这是命名空间最有用的场景!
#include <iostream> using namespace std; // 第一个命名空间 namespace A { void print() { cout << "我是 A 空间的 print" << endl; } } // 第二个命名空间(同名函数!) namespace B { void print() { cout << "我是 B 空间的 print" << endl; } } int main() { // 分别调用,完全不冲突 A::print(); B::print(); return 0; }运行结果:
我是 A 空间的 print 我是 B 空间的 print结论:
只要放在不同命名空间,同名函数 / 变量完全没问题。
示例 3:using 声明(只导入一个成员)
#include <iostream> using namespace std; namespace myMath { int add(int a, int b) { return a + b; } } // 只导入 myMath 里的 add 函数 using myMath::add; int main() { // 直接用 add,不用写 myMath:: cout << add(3, 5) << endl; return 0; }优点:只导入需要的,比全导入安全。
示例 4:using namespace(全部导入)
#include <iostream> using namespace std; // 导入标准库所有内容 namespace demo { void test() { cout << "test()" << endl; } } // 一次性导入 demo 所有内容 using namespace demo; int main() { test(); // 直接用 return 0; }⚠️警告:
using namespace 命名空间;小代码可以用,大型项目尽量别用,容易引发名字冲突!
四、进阶知识点(面试常考)
1. 命名空间可以嵌套
namespace outer { int a = 10; namespace inner { int b = 20; void show() { cout << a << " " << b << endl; } } } // 使用 outer::inner::show();2. 命名空间是开放的(可以分段写)
同一个命名空间可以写在多个地方,编译器会自动合并:
namespace ns { int x = 1; } namespace ns { int y = 2; } // 最终 ns 里有 x 和 y3. 匿名命名空间(内部专用)
没有名字的空间,只能在当前文件使用,类似 static:
namespace { int secret = 999; } // 直接用 secret,别的文件访问不到4. 标准库都在 std 命名空间里
你写的:
cout << "hello";真实面目:
std::cout << "hello";所以写using namespace std;就是为了偷懒少写std::
五、最佳实践(一定要记住)
项目里永远优先用:
命名空间::成员头文件里绝对不要写
using namespace std;大型项目禁止随便用
using namespace自己写库、模块时,一定要用命名空间包裹
六、总结
命名空间 = 防止名字冲突
核心符号:
::(作用域解析符)三种用法:
空间::成员(最安全)using 空间::成员;(导入单个)using namespace 空间;(全部导入,少用)
标准库都在
std里
