[C++] namespace命名空间和using用法
命名空间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、无名命名空间中的成员使用方式与全局变量使用方式相同。
[C++] namespace命名空间和using用法的更多相关文章
- 命名空间 extern的用法 static全局变量
std是标准库中的命名空间: 关于extern的用法可以参考文献http://blog.163.com/sunjinxia%40126/blog/static/94984879201312145021 ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- 3-18 关于namespace,双冒号::的用法; SelfYield.
关于namespace,双冒号::的用法. 防止引用多个模块在一个文件/类中,有重名的对象.::可以调用类的类方法,和常量. class Foo BAR = "hello" ...
- PHP命令空间namespace及use的用法实践总结
以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...
- XML Namespace 命名空间
根据 Namespaces in XML W3C 推荐标准的定义,XML 命名空间 是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML“词汇”. 定义 XML 命 ...
- 第一章 01 namespace 命名空间
一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. ...
- 关于JavaScript的namespace命名空间
写C或者JAVA习惯的人写JavaScript时可能会发现JavaScript并没有命名空间这一概念,当然如果没有接触过命名空间的程序猿(比如写js,PHP,Python)也可能对命名空间不关注或者不 ...
- c++ namespace命名空间详解
What is a namespace? A namespace defines an area of code in which all identifiers are guaranteed to ...
- namespace命名空间
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的.可以将 PHP 命名空间与文件系统作一个简单的类比.在文件系统中访问一个文件有三种方式: 相对文件名形式如foo ...
随机推荐
- layui 框架 table插件 实现键盘快捷键 切换单元格编辑
最近使用layui的框架时,发现table插件不支持键盘快捷键切换单元格,花了点时间实现此功能. 分享给有需要的朋友们~~~ 效果图 代码: 1.支持 enter,上,下,右键 切换单元格,支持隐藏列 ...
- 多代理切换 MultiProxy
配置代理选项 添加代理列表 ie配置代理 开始使用
- poll_wait阻塞/唤醒
1. 应用阻塞 应用程序使用 select() 或 poll() 调用设备驱动程序的 poll() 函数,该函数把输入输出复用处理的等待队列追加到由内核管理的进程的 poll_table()上 #in ...
- C#与.net 入门
C# 语言和 .NET Framework 介绍 https://docs.microsoft.com/zh-cn/dotnet/csharp/getting-started/introduction ...
- Vue+SpringBoot后端接收包含单属性和List数组的json对象
这次主要是针对springboot后台接收的json中包含多对象(如List数组/单属性)所写的一篇文章.虽然网上类似情况很多,尝试了一个晚上,都没有解决问题,最后还是在师兄的帮助下完美解决. vue ...
- Oracle UNDO块
过程:开始一个事务--通过事务信息找到UNDO块头的所在的段名及数据文件号等--转储UNDO header--在事务表中对应槽位找到前镜像dba--转储数据块--找到对应记录得到bdba--转储数据块 ...
- Java开发环境之Solr
查看更多Java开发环境配置,请点击<Java开发环境配置大全> 玖章:Solr安装教程 1)官网下载Solr安装包 http://lucene.apache.org/solr/downl ...
- 分布式数据库中间件、产品——sharding-jdbc、mycat、drds
一般对于业务记录类随时间会不断增加的数据,当数据量增加到一定量(一般认为整型值为主的表达到千万级,字符串为主的表达到五百万)的时候,性能将遇到瓶颈,同时调整表结构也会变得非常困难.为了避免生产遇到这样 ...
- 编译安装 keepalived-2.0.16.tar.gz
一.下载安装包 wget https://www.keepalived.org/software/keepalived-2.0.16.tar.gz 安装相关依赖 把所有的rpm包放在一个目录下. rp ...
- 树莓派配置samba服务器,实现linux、windows文件共享
一.安装samba服务器 输入如下命令: 二.配置文件smb.conf 找到[homes],将read only那里的yes改为no,允许读写 添加用户和设置密码 sudo smbpasswd -a ...