命名空间namespace:指标识符的各种可见范围。

C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因。

很多人共同完成一套代码,不可能不出现标识符命名相同的问题,为了解决冲突问题,产生了命名空间namespace。

命名空间包括又名命名空间和无名命名空间

一、有名命名空间

有名命名空间的定义格式:

namespace 空间名 {
code
} // 有名命名空间的嵌套定义
namespace 空间名1 {
code
namespace 空间名2 {
code
}
}

有名命名空间的使用格式:

// 直接使用"::"连接空间名和code
空间名:: code; // code为变量或函数

有名命名空间取别名为了方便使用,定义格式如下:

namespace 别名 = 空间名;

using 指令使用格式:

// 表示后面代码都使用此命名空间,如果属空于本空间,无需再使用"::"连接空间名和code
using namespace 空间名; // 空间名支持嵌套 //最常用的std空间
using namespace std;

举例:

#include <iostream>
// 使用std命名空间下的变量
using namespace std; int a = ; namespace A {
int a = ; // 命名空间支持嵌套定义
namespace B {
int a = ;
int b = ;
} // 命名空间可以重复定义,相当于扩充
namespace B {
int x = ;
int y = ;
}
} namespace C {
int a = ;
// 错误,命名空间不能嵌套声明
// namespace D;
} int main(void)
{
// 如果不写using namespace std,就必须加前缀std::
std::cout << "Hello World!" << std::endl;
cout << endl; // 换行 cout << "a = " << a << endl;
cout << "A::a = " << A::a << endl;
cout << "A::B::a = " << A::B::a << endl;
cout << "C::a = " << C::a << endl; // 错误,提示变量b没有声明
// cout << "b = " << b << endl; cout << endl; // 命名空间取别名
namespace AB = A::B;
cout << "AB = A::B" << endl;
cout << "AB::a = " << AB::a << endl;
cout << "AB::b = " << AB::b << endl; cout << endl; // 后面的代码使用A::B命名空间下的变量
using namespace A::B;
cout << "使用A::B命名空间" << endl;
cout << "b = " << b << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl; return ;
}

执行结果:

二、无名命名空间

命名空间不仅可以避免名称冲突,还可以是代码保持局部性,从而保护代码不被他人非法使用。

在当前的编译单元直接使用无名命名空间中的成员,但是在当前编译单元之外,它是不可见的

无名命名空间定义格式:

namespace {
code
}

举例:

#include <iostream>
// 使用std命名空间下的变量
using namespace std; // 如果定义与无名命名空间相同,则会产生冲突报错
//int a = 5; namespace {
int a = ;
int b = ; namespace B {
int a = ;
int b = ;
} int add(int a, int b)
{
return (a + b);
}
} int main(void)
{
// 默认使用无名命名空间中的变量和空间
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "B::a = " << B::a << endl;
cout << "B::b = " << B::b << endl; cout << endl; cout << "a + b = " << add(a, b) << endl;
cout << "B::a + B::b = " << add(B::a, B::b) << endl; return ;
}

执行结果:

总结:

1、命名空间可以嵌套定义,但不能嵌套声明;

2、可以多次声明和定义同一命名空间,相当于扩充,并添加新成员;

3、无名命名空间中的成员不能与同一文件中外部的成员相同;

4、无名命名空间中的成员使用方式与全局变量使用方式相同。

最新文章

  1. js统计,然后去重例子
  2. Oracle 安装后关于用户
  3. IOS 友盟使用详解
  4. Add baidu map in your website (wordpress)
  5. 如何让DIV在窗口水平和垂直居中
  6. -25299 reason: &#39;Couldn&#39;t add the Keychain Item.&#39;
  7. 使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework
  8. 《Python爬虫学习系列教程》学习笔记
  9. [js高手之路]设计模式系列课程-委托模式实战微博发布功能
  10. java容器类4:Queue深入解读
  11. HTML DOM innerHTML 属性及实现图片连续播放
  12. spring-mvc里的 &lt;mvc:resources&gt; 及静态资源访问
  13. iframe 自适应高度、父子页面传值、回调
  14. SparkContext初始化之SparkScheduler初始化
  15. 如何做自己的服务监控?spring boot 1.x服务监控揭秘
  16. UVa 508 Morse Mismatches (模糊暴力)
  17. simhash和minhash实现理解
  18. Request to https://bower.herokuapp.com failed with 502
  19. 微信小程序基础语法总结
  20. python文件备份脚本

热门文章

  1. 手写MQ框架(一)-准备启程
  2. Ext下载文件
  3. css-博客样式初体验
  4. 原油petrolaeum石油 Archaic spelling of petroleum
  5. mariadb远程授权问题
  6. 华为云主机配置yum源
  7. 原创:基于visual studio 2010 对话框程序的创建
  8. docker 安装 oracle
  9. Python的logging模块详解
  10. django项目中使用bootstrap插件的分页功能。