namespace:命名空间或者叫名字空间,传统的c++只有一个全局的namespace,但是由于现在的程序规模越来越大,程序的分工越来越细,全局作用域就变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类、对象、函数聚集在一个名字下,本质上讲namespace是对全局作用域的细分。

比如这样的程序大家经常见到的:

 #include <iostream>
using namespace std; int main()
{
printf("hello world !");
return ;
}

大部分可能对namespace了解也就这么多。但是namespace远不止如此,下面让我再多了解一下namespace。

namespace的基本格式是:

namespace identifier
{
    entities;
}

举个例子

namespace exp
{
    int a,b;
}
有点类似于类,但完全是两种不同的类型。
为了在namespace外使用namespace内的变量我们使用::操作符,如下
exp::a
exp::b

使用namespace可以有效的避免重定义的问题。

如下面的例子:

 #include <iostream>
using namespace std; namespace first
{
int var = ;
} namespace second
{
double var = 3.1416;
} int main () {
cout << first::var << endl;
cout << second::var << endl;
return ;
}

输出的结果为:
5
3.1416
两个全局变量都是名字都是var,但是他们不在同一个namespace中所以没有冲突。

关键字using可以帮助从namespace中引入名字到当前的声明区域

 #include <iostream>
using namespace std; namespace first
{
int x = ;
int y = ;
} namespace second
{
double x = 3.1416;
double y = 2.7183;
} int main () {
using first::x;
using second::y;
cout << x << endl;
cout << y << endl;
cout << first::y << endl;
cout << second::x << endl;
return ;
}

输出是
5
2.7183
10
3.1416
就如我们所指定的第一个x是first::x,y是second.y

using也可以导入整个的namespace

 #include <iostream>
using namespace std; namespace first
{
int x = ;
int y = ;
} namespace second
{
double x = 3.1416;
double y = 2.7183;
} int main () {
using namespace first;
cout << x << endl;
cout << y << endl;
cout << second::x << endl;
cout << second::y << endl;
return ;
}

输出是
5
10
3.1416
2.7183
正如我们所预见的导入的整个的first的namespace,前一对x,y的值就是first中的x,y的值。
这里我们不能在“using namespace first;“下加一句“using namespace second;“,为什么呢?
这样做无异于直接完全的忽视namespace first和namespace second,会出现重复定义的结果,所以前面的hello_world.c中的using指令的使用一定程度上存在问题的,只是因为我们就用了一个namspace,一旦引入了新的namespace这种做法很可能会出现重复定义的问题。

在头文件中,我们通常坚持使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的效用就会受到限制并且易于使用。类似的例子有

 #include <iostream>
using namespace std; namespace first
{
int x = ;
} namespace second
{
double x = 3.1416;
} int main () {
{
using namespace first;
cout << x << endl;
}
{
using namespace second;
cout << x << endl;
}
return ;
}

输出是
5
3.1416
可以看到两个不同的namespace都被限制在了不同作用域中了,他们之间就没有冲突。

namespace也支持嵌套

 #include <iostream>

 namespace first
{
int a=;
int b=; namespace second
{
double a=1.02;
double b=5.002;
void hello();
} void second::hello()
{
std::cout <<"hello world"<<std::endl;
}
} int main()
{
using namespace first; std::cout<<second::a<<std::endl;
second::hello();
}

输出是
1.02
hello world
在namespace first中嵌套了namespace second,seond并不能直接使用,需要first来间接的使用。

C++ namespace的作用的更多相关文章

  1. 转:C++ 匿名namespace的作用以及它与static的区别

    匿名namespace的作用以及它与static的区别 一.匿名namespace的作用在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做为函数名或者全局变量名,则 ...

  2. C++ 匿名namespace的作用以及与static的区别

    匿名namespace的作用以及它与static的区别 一.匿名namespace的作用 在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做 为函数名或者全局变量名 ...

  3. C++命名空间 namespace的作用和使用解析

    一. 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突. 在 C语言中定义了3个层次的作用域,即文件(编译单元).函数和复合语句.C ...

  4. 【转】C++命名空间 namespace的作用和使用解析

    一. 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突. 在 C语言中定义了3个层次的作用域,即文件(编译单元).函数和复合语句.C ...

  5. 46. Ext中namespace的作用(转)

    转自:https://www.cnblogs.com/givemeanorange/p/5569954.html Ext中在每一个页面中添加一个namespace呢,就像下面的代码: // creat ...

  6. namespace 的作用

    在写CPP的时候,常常要写using namespace std;这么一句话,到底有什么用呢? #include <iostream> namespace first { ; } name ...

  7. namespace的作用

    namespace的用法 1.什么是命名空间 通常我们学c++的时候经常看见头文件下有一句using namespace std,有什么用呢? 例如: #include<iostream> ...

  8. namespace的作用及用法

    namespace 所谓namespace,是指标识符的可见范围.C++标准库中的所有标识符都被定义在一个名为 std 的namespace 中. 一.<iostream>和<ios ...

  9. mybatis中的命名空间(namespace)的作用

    mybatis中为每一个映射文件添加一个namespace,这样不同的映射文件中sql语句的id相同也不会有冲突,只要定义在映射文件中的sql语句在该映射文件中id唯一就可以

随机推荐

  1. js前端读写文件的方法(json、excel)

    1.前端读取文件的实现 关键:利用文件上传对话框预览本地文件.利用FileReader读取文件 前端预览本地文件 <input tabindex="-1" id=" ...

  2. 中文分词 sphni与scws

    1.安装sphnixcd /usr/local/srcwget http://sphinxsearch.com/files/sphinx-2.2.11-release.tar.gztar -zxvf ...

  3. 客户端(winform)更新

    winform更新有两种情况,一种是在线更新在线使用:直接右击项目发布出去就可以更新在线使用了.还有一种更新是不用一直连接网络的模式. 1:C#Winform程序如何发布并自动升级--------ht ...

  4. 分享:docker swarm集群搭建

    [Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu.   网上有用docker-machine创建虚拟机做的例子.   这里直接用VMware创建这三台虚拟机,然后用xshell连 ...

  5. CSS3动画箭头

    <style type="text/css"> .arrow { display: block; width: 20px; height: 20px; position ...

  6. C语言博客作业—字符数组

    一.PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 (1)定义i为循环变量,number用于存放每一次转化的结果,flag用于判断是否为负数,p用于修改结果的 ...

  7. 201621123060 《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  8. Numpy - 多维数组(上)

    一.实验说明 numpy 包为 Python 提供了高性能的向量,矩阵以及高阶数据结构.由于它们是由 C 和 Fortran 实现的,所以在操作向量与矩阵时性能非常优越. 1. 环境登录 无需密码自动 ...

  9. AWK读书笔记

    1.awk 'parttern {action}' filename 从文件中逐行读取并匹配parttern,若匹配成功执行action否则读取下一行. parttern和action都可选,若省略p ...

  10. 数据恢复案例分享:MSSQL 2000 错误823

    一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...