对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。

  1. 关于namespace
  C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法就是加上自己的命名空间。比如下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    int a=1;
    cout<<"张三定义的a="<<ZhangSan::a<<endl;
    cout<<"李四定义的a="<<LiSi::a<<endl;
    cout<<"主函数定义的a="<<a<<endl;   
}
  上例中的“ZhangSan::a”和“LiSi::a”分别表示了调用张三命名空间中的a变量和李四命名空间中的a变量。这样的好处显而易见,那就是虽然张三和李四这两个程序员都定义了一个变量a,但是并不会出现重名的危险。
运行结果为:
 
  
  2. 关于using namespace *
  顾名思义,using namespace * 就表示释放命名空间* 中间的东西。好处在于我们在程序里面就不用在每个函数的头上都加上*::来调用。比如说如果上面那个程序,如果我们不在using namespace std,那么我们就需要在主函数中的标准输出流cout函数前面加上std,写成

std::cout
表示调用std空间里面的标准输出流cout。但是有些时候我们也不能图这个方便,比如说如果在主函数中将命名空间ZhangSan和LiSi的中所定义的变量释放出来,如下例1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    int a=1;
    using namespace ZhangSan;
    using namespace LiSi;
    cout<<a<<endl;
}
这个程序输出结果为:
如果我们在主函数中把 int a=1给删除,如下例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
namespace ZhangSan
{
    int a=10; //张三把10赋值给了变量a
}
namespace LiSi
{
    int a=5; //李四把10赋值给了变量a
}
 
void main()
{
    using namespace ZhangSan;
    using namespace LiSi;
    cout<<a<<endl;
}
会发现根本就不会通过编译,输出的错误信息为:
error C2872: “a”: 不明确的符号
  分析可以看出,上面这个例2会引起歧义。因为ZhangSan中间的a被释放出来,同理LiSi中间的a也被释放出来了。那么编译器就不知道到底哪个才是需要输出的a,自然就会引起歧义了。同理,在例1中,编译器同样不知道到底哪个才是需要输出的a,于是它只采用了主函数中自己定义的a,这样程序也不会报错,但是只会输出1,自然结果就如上面的图所示了。
见:http://www.cnblogs.com/uniqueliu/archive/2011/07/10/2102238.html

【转】关于“using namespace std”的更多相关文章

  1. using namespace std 和 using std::cin

    相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...

  2. namespace std

    c++中使用namespace来防止命名冲突(重命名),我们经常使用的一些函数和变量都被放在一个叫std的namespace中,如标准I/O流操作,vector等等.我们在每一个文件中都可使用std中 ...

  3. C++ using namespace std(转载)

    转载自http://www.kuqin.com/language/20080107/3532.html 感谢这位大神的解答! 以下的内容摘抄自转载的文章里面的部分内容. 早些的实现将标准库功能定义在全 ...

  4. 不要在头文件中使用 using namespace std;

    不要在头文件中使用(using namespace std;).   若你使用了using namespace std;,在某一头文件中,那么包含这些头文件的文件就失去了"namespace ...

  5. using namespace std

    using namespace std std 是一个命名空间..不同的命名空间可以有相同的类名被定义 ..using namespace std;就是指明下面的程序使用std,如果不用这句指明的话就 ...

  6. #include<iostream.h>与#include<iostream> using namespace std的区别

    所谓namespace,是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的namespace中.  一 :<iostream>和<iostream.h ...

  7. 关于using namespace std

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~关于using   namespace   std ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  8. 有多个.h引用时,不能有using namespace std

    #include<iostream.h> #include<math.h> //using namespace std; 有多个.h引用时,不能有这个,否则无法运行. void ...

  9. 关于C++中using namespace std

    原文链接:http://www.kuqin.com/language/20080107/3532.html <iostream>和<iostream.h>是不一样,前者没有后缀 ...

  10. (C++)浅谈using namespace std

    1.<iostream>和<iostream.h> 在你的编译器include文件夹里面可以看到,二者是两个文件,里面的代码是不一样的. 后缀为.h的头文件c++标准已经明确提 ...

随机推荐

  1. Robot Frame应用实例讲解

    关键字与变量 内置库(build in)关键字 要使用的其它库关键字(学会看文档)

  2. DOM事件-冒泡、捕获、传播、委托

    事件捕获 以点击事件为例事,同类型事件会由根元素开始触发,向内传播,一直到目标元素.从外到内依次触发:根—目标的祖先素—目标的父元素—目标元素. 事件冒泡 根事件捕获截然相反.发生点击事件时,事件会从 ...

  3. js函数—隐形参数this

    前言 this是函数中的隐形参数,它绑定的值取决于函数的调用位置. this的定义 <你不知道的js>中是这样说的:是函数体内的隐式参数,this就是记录函数调用上下文的一个属性.可以在函 ...

  4. cmd 中粘贴复制(转)

    1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框上选择“保存属性,供以后具有相同标题的窗口使用”: 4 如此你就可以 ...

  5. EXP-00000: Message 0 not found; No message file for product=RDBMS, facility=EXP问题的解决方案

    EXP-00000: Message 0 not found; No message file for product=RDBMS, facility=EXP 最近在服务器上准备做一个批处理,定时备份 ...

  6. 《SQL 进阶教程》case :用一条 SQL 语句进行不同条件的统计

    进行不同条件的统计是case表达式的著名用法之一 select name,sum(case when sex = 1 then population else 0 end) as cnt_m,sum( ...

  7. [题解]luogu_P2155_BZOJ_2186沙拉公主的困惑

    题意求1~N!中与M!互质的数的个数, 首先证明gcd(a,b)=1时gcd(a-kb,b)=1 gcd(a,b)=1 gcd(a%b,b)=1 gcd(a-kb,b)=1 即a-kb与b互质 这样由 ...

  8. 位运算>>和>>>区别

    int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...

  9. java--时间日期用法

    转载大神 https://www.cnblogs.com/Mr-Lyu/p/5736152.html https://blog.csdn.net/yf198708/article/details/51 ...

  10. 啊哈算法之宽搜BFS解救小哈

    简述 本算法摘选自啊哈磊所著的<啊哈!算法>第四章第三节的题目——BFS算法再次解救小哈.文中代码使用C语言编写,博主通过阅读和理解,重新由Java代码实现了一遍,以此来理解BFS算法.关 ...