当前位置: 首页 > java >正文

Namespace 命名空间的使用

名字空间:划分更多的逻辑空间,有效避免名字冲突的问题

1.什么是命名空间

名字命名空间 namespace 名字空间名 {...}

// 名字空间 n1 域
namespace n1 {// 全局变量int g_money = 0;void save(int money){g_money += money;}void pay(int money){g_money -= money;}
}
2.名字空间合并

名字命名空间 namespace 名字空间名 {...}

名字命名空间 namespace 名字空间名 {...}

编译器会自动将多个名字相同的命名空间合并为一个名字空间

namespace n1 {// 全局变量int g_money = 0;void save(int money){g_money += money;}
}
namespace n1 {void pay(int money){g_money -= money;}
}
3.名字空间声明函数

在命名空间内声明函数,但是在外面定义函数

namespace n3 {// 全局变量int g_money = 0;void save(int money)   // 声明并定义{g_money += money;}void pay(int money);   //  声明
}void n3::pay(int money)  // 定义
{g_money -= money;
}
4.如何使用命名空间呢?(3种)
1) 作用域限定符::
namespace ns {int g_val = 0;
}cout << "ns::g_val = " << ns::g_val << endl;
2)名字空间指令
namespace ns {int g_val = 0;
}using namespace ns;  // 从这行代码开始,ns中的内容在当前作用域可见 -->可见表g_val = 100;cout << "g_val = " << g_val << endl;

如果命名空间和main方法中都有g_val变量,它具体使用哪一个变量呢

namespace ns {int g_val = 0;
}int main() {int g_val = 5;  // 定义表using namespace ns;g_val = 100;cout << "g_val = " << g_val << endl;  // 100  这里找到的是局部变量int g_val = 5; cout << "ns::g_val = " << ns::g_val << endl;  // 0}

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

namespace ns {int g_val = 0;
}int g_val = 5;  // 全局变量,出现在 可见表int main() {using namespace ns;g_val = 100;cout << "g_val = " << g_val << endl;cout << "ns::g_val = " << ns::g_val << endl;}

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

namespace ns {int g_val = 0;
}int g_val = 5;using namespace ns;int main() {g_val = 100;cout << "g_val = " << g_val << endl;cout << "ns::g_val = " << ns::g_val << endl;}

3) 名字空间声明
namespace ns {int g_val = 0;
}int main() { // 名字空间声明using ns::g_val;  //  从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)g_val = 35;cout << "g_val = " << g_val << endl;  // g_val = 35cout << "ns::g_val = " << ns::g_val << endl;  // ns::g_val = 35}

如果再定义一个局部变量,就会报重复定义的错误 重定义;多次初始化

namespace ns {int g_val = 0;
}int main() {// 名字空间声明using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)int g_val = 3; // 	“ns::g_val”: 重定义;多次初始化	ProjectDemo0525			g_val = 35;cout << "g_val = " << g_val << endl;cout << "ns::g_val = " << ns::g_val << endl;}

如果再定义一个局部变量,就会报重复定义的错误 重复声明

namespace ns {int g_val = 0;
}int main() {int g_val;// 名字空间声明using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)g_val = 35;cout << "g_val = " << g_val << endl;cout << "ns::g_val = " << ns::g_val << endl;}

题目一 下面输出什么内容? 哪个命名空间里的值?
namespace ns1 {int m_val = 0;int m_other = 0;
}namespace ns2 {int m_val = 0;int m_other = 0;
}int main()
{using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)using ns2::m_val; // 名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中m_val = 50;cout << "ns1::m_val = " << ns1::m_val << endl;  // 0cout << "ns2::m_val = " << ns2::m_val << endl;  // 50m_other = 35;cout << "ns1::m_other = " << ns1::m_other << endl;  // 35cout << "ns2::m_other = " << ns2::m_other << endl;  // 0}

猜对了么? 输出的是 ns2::m_val 和 ns1::m_other 有值

using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)

using ns2::m_val;; //名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中

5.1 名字空间嵌套

namespace md1 {namespace md2 {namespace md3 {namespace md4 {int f = 30;}}}
}int main() {cout << md1::md2::md3::md4::f << endl;  // 30}

名字空间别名可以简化书写

namespace md_four = md1::md2::md3::md4;cout << md_four::f << endl;  // 30

http://www.xdnf.cn/news/10272.html

相关文章:

  • (7)-Fiddler抓包-Fiddler状态面板-QuickExec命令行
  • 项目日记 -Qt音乐播放器 -搜索模块
  • 如何手搓扫雷(待扩展)
  • pytest中的元类思想与实战应用
  • C++基础算法————贪心
  • Kafka 如何保证不重复消费
  • Linux搭建DNS服务器
  • BLE协议全景图:从0开始理解低功耗蓝牙
  • 堆与堆排序及 Top-K 问题解析:从原理到实践
  • 玩客云WS1608控制LED灯的颜色
  • 光电设计大赛智能车激光对抗方案分享:低成本高效备赛攻略
  • C 语言栈实现详解:从原理到动态扩容与工程化应用(含顺序/链式对比、函数调用栈、表达式求值等)
  • python连接邮箱的协议选择
  • C语言结构体的别名与创建结构体变量
  • jetpack compose 界面刷新的几种方式 如何避免无效的界面刷新
  • Remote Sensing投稿记录(投稿邮箱写错、申请大修延期...)风雨波折投稿路
  • Adobe Acrobat 9.1.2 Pro (install)
  • 电路图识图基础知识-常用仪表识图及接线(九)
  • 特征图可视化代码
  • 数据库核心技术深度剖析:事务、索引、锁与SQL优化实战指南(第四节)----从行级锁到死锁处理的系统梳理
  • WIN11+CUDA11.8+VS2019配置BundleFusion
  • Linux之MySQL安装篇
  • Redis主从复制详解
  • 扫一扫的时候会经历哪些事
  • 华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 哪些工作最容易被AI取代?
  • C++基础算法————深度优先搜索(DFS)
  • 【速通RAG实战:进阶】17、AI视频打点全攻略:从技术实现到媒体工作流提效的实战指南
  • 嵌入式(C语言篇)Day13
  • Go语言事件总线EventBus本地事件总线系统的完整实现框架