【转】关于“using namespace std”

对于一个存在着标准输入输出的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

时间: 2024-10-14 16:55:09

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

C++ using namespace std(转载)

转载自http://www.kuqin.com/language/20080107/3532.html 感谢这位大神的解答! 以下的内容摘抄自转载的文章里面的部分内容. 早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现:当使用<iostream>的时候,该头文件没有定义全局命名空

using namespace std

using namespace std std 是一个命名空间..不同的命名空间可以有相同的类名被定义 ..using namespace std;就是指明下面的程序使用std,如果不用这句指明的话就要用std::string(string是std空间中定义的也可以在全局空间中定义,只要名字空间不一样即可..)..否则可以默认名字空间中有std.便不用std::来修饰它是C++新标准中有的,解决多人作编大程序时名字冲突问题.比如A B两个班都有叫张三的人,你要使用A班的张三,必然要先指名是A班这

(转)c++ 中的using namespace std是什么意思,什么时候用

使用std命名空间 98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题.举一个实例,请注意以下两个头文件: // one.hchar func(char);class String { ... }; // somelib.hclass String { ... }; 如果按照上述方式定义,那么这两个头文件不可能包含在同一个程序中,因为String类会发生冲突.所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙.比如://

Error:全局变量不明确(using namespace std 与全局变量的冲突)

在用递归写八皇后时,定义了一个全局变量count,结果出现问题如下:提示全局变量不明确. 最后发现在实现文件.cpp中,我使用了using  namespace std; 解决方法: 1.使用count 的地方改成 ::count 替代(因为std命名空间下也有 std::count ,编译器不确定此处是::count 还是std::count,所以会不明确) 2.注释掉这个命名空间 3.或者改用 : using std::cout; using std::endl; using std::ci

using namespace std;的注意事项

作者:zhang.jingjing链接:转自  https://www.zhihu.com/question/26911239/answer/51503880来源:知乎 因为使用STL中 有部分名称是没有加下划线的保留标记的而在自己的源代码中用到了后会引发未定义的后果 例如: #include <algorithm> using namespace std; int main() { int max=0; } 一直我都告诫学习C++的人 以后精通了C++就不要用using namespace

关于using namespace std

[来自]http://www.cnblogs.com/uniqueliu/archive/2011/07/10/2102238.html 对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std; 这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义.其作用就在于避免发生重命名的问题. 1. 关于namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个

C++“using namespace std;”的理解

如果程序中需要使用C++的输入(cin)或输出(cout)工具,必须提供这样两行代码: 1 #include <iostream> 2 using namespace std; //可以使用空间名称为std里面的东西 当我建立一个名为HelloWord 的C++工程时会出现这样的代码: 1 using namespace HelloWord; //可以使用空间名称为HelloWord里面的东西 C++引入名称空间namespace的目的是避免多个程序员在编写同一个项目时出现函数或变量重名的现象

(C++)浅谈using namespace std

1.<iostream>和<iostream.h> 在你的编译器include文件夹里面可以看到,二者是两个文件,里面的代码是不一样的. 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里: c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 因此, 当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现: 当使用<iostr

std::和using namespace std;

std是标准命名空间名称 相同点: std::和using namespace std:的意思是一样的,都表示使用命名空间std: 不同点: 放在程序中的位置不同 1. using  namespace  std:头文件如果包含了#include<iostream>,那么在头文件下方写上using  namespace  std:2.std::头文件如果包含了#include<iostream>,但是没有在头文件下方写上using  namespace  std:那么在使用标准输入