C++命名空间
命名空间定义与核心作用
定义:namespace 是 C++ 用于划分代码作用域的语法容器,可以存放变量、函数、类、结构体等代码
核心作用:解决命名冲突
大型项目、多第三方库中,不同模块容易出现同名类 / 同名函数
命名空间给标识符增加专属前缀,区分同名符号,互不干扰
基础语法规则
1.关键字:namespace + 自定义命名空间名(规范小写)
2.内部可存放:全局变量、普通函数、类、结构体、模板等所有代码
3.多个命名空间内可以存在完全同名的变量 / 函数 / 类,不会冲突
namespace 空间名
{
// 变量、函数、类
}
三种访问命名空间成员的方式
方式 1:完整限定访问(最安全,推荐大型项目)
格式:命名空间::成员名不需要提前导入,全程显式指定所属空间,无命名污染
方式 2:using namespace 空间名; 全局导入
一次性把空间内所有标识符引入当前作用域,后续可直接写成员名,简化代码
缺点:大量使用易再次引发命名冲突,小型测试程序常用
方式 3:using 空间名::单个成员; 单独导入指定成员
只引入某一个变量 / 函数,兼顾简洁与安全性
全局命名空间
所有没有写在任何 namespace 内部的代码,都属于全局命名空间
访问全局成员:单独使用作用域符号 ::变量名,区分局部同名符号
int num = 999; // 全局命名空间
namespace ns
{
int num = 10;
void test()
{
cout << ::num; // 取全局的num
cout << num; // 取ns内部的num
}
}
跨文件使用同一个命名空间
1.不同.h/.cpp文件中,重复书写同名namespace,代码会合并到同一个空间
2,常用于项目分层:把同一业务模块的类、函数全部收纳在同一个命名空间下,统一管理
分文件示例
// file1.h
namespace game
{
class Player{};
}
// file2.cpp
#include "file1.h"
namespace game
{
class Monster{}; // 和Player同属game命名空间
}
完整演示代码
#include <iostream>
using namespace std;
// 第一个命名空间 ns1
namespace ns1
{
int a = 100;
void fn()
{
cout << "ns1 的 fn 函数" << endl;
}
class CObject
{
public:
void show()
{
cout << "ns1 的 CObject" << endl;
}
};
}
// 第二个命名空间 ns2,成员名和ns1完全重复,无冲突
namespace ns2
{
int a = 200;
void fn()
{
cout << "ns2 的 fn 函数" << endl;
}
class CObject
{
public:
void show()
{
cout << "ns2 的 CObject" << endl;
}
};
}
int main()
{
// 1. 完整限定访问 ::
cout << ns1::a << endl;
ns1::fn();
ns1::CObject obj1;
obj1.show();
cout << "---------" << endl;
cout << ns2::a << endl;
ns2::fn();
ns2::CObject obj2;
obj2.show();
// 2. using 导入整个命名空间
using namespace ns1;
cout << a << endl;
fn();
// 3. using 单独导入某一个成员
using ns2::a;
cout << a << endl;
return 0;
}
总结
1.作用:隔离同名标识符,解决大型项目命名冲突
2.定义:namespace 名字 { 变量/函数/类 }
3.访问:空间::成员、using namespace 空间、using 空间::成员
4.全局空间:未放入任何 namespace 的代码,用::变量访问
5.跨文件:多文件写同名 namespace,代码自动合并为同一个空间,用于项目模块化管理
更多推荐

所有评论(0)