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. flex布局简析

    最近开始对flex布局进行一个重新的认识. 首先. flex布局适用于所有元素 但是注意一点的就是,一旦父级元素设定flex布局的时候,子元素的传统布局属性, float,clear,vertical ...

  2. 4.Apache POI使用详解

    一.POI结构与常用类 1.POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人 ...

  3. NOIP2017划水崩盘记

    Before-Day1              自信心爆棚,老子一定能拿省一.一天啥也没干,一顿乱奶.敬等明日切T1写暴力. Day 1 哈哈哈,T1是数论,闭眼睛切啊!! ...然后就Gg了,写的 ...

  4. eclipse中svn的各种状态图标详解

    - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽略文件. A file ignored by version co ...

  5. python替换残缺的多域名图片网址

    在获取网站真是图片的时候,经常遇到图片链接残缺问题. 例如下图所示的情况: img标签中的图片链接是残缺的,如果这个网站域名又是多种情况的话,比如 http://sports.online.sh.cn ...

  6. maven的使用(基础1)

    这是我第一次写博客,这个想法源于我的师傅对我的建议,一是与大家一起进步,二是让自己养成总结的好习惯. "如果你步入的maven的世界,你便打开了Java的另一扇大门". 这篇文章是 ...

  7. 指令-arModal-点击提示框模板

    html 使用<ar-modal></ar-modal>: <ar-modal modal-obj="modalObj" ok="newAl ...

  8. 【alpha冲刺】随笔合集

    Daily Scrum Meeting 第一天 [Alpha]Daily Scrum Meeting第一次 第二天 [Alpha]Daily Scrum Meeting第二次 第三天 [Alpha]D ...

  9. 高级软件工程第三次作业 赵坤&黄亦薇

    0.小组成员 赵坤2017282110261 黄亦薇201728210260 1.项目Github地址  https://github.com/zkself/homework3 PS:建议使用chro ...

  10. 学号:201621123032 《Java程序设计》第3周学习总结

    1:本周学习总结 1. 写出你认为本周学习中比较重要的知识点关键词. 类,对象,封装,继承,方法. 2. 用思维导图或者Onenote或其他工具将这些关键词组织起来 2:书面作业 2.1:以面向对象方 ...