博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 using namespace * (转载)
阅读量:6004 次
发布时间:2019-06-20

本文共 1777 字,大约阅读时间需要 5 分钟。

原文链接:

 

对于一个存在着标准输入输出的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,自然结果就如上面的图所示了。

转载于:https://www.cnblogs.com/cosmo89929/archive/2013/01/06/2847004.html

你可能感兴趣的文章
poj1929
查看>>
Model1 登录实例
查看>>
kotlin 编译 运行 hello world
查看>>
深入理解jvm jdk1,7(16)
查看>>
【转载】白话经典算法系列之五 归并排序的实现
查看>>
2012 Multi-University #10
查看>>
JS(去掉前后空格或去掉所有空格)的用法
查看>>
HTML基础-第一讲
查看>>
9. ZooKeeper之搭建单机模式。
查看>>
css sprite讲解与使用实例
查看>>
[置顶] 我的 Java 后端书架 (2016 年暖冬版)
查看>>
Linux常用命令(持续更新中)
查看>>
c语言运算符
查看>>
初步认识消息中间件
查看>>
iOS自动化探索(二)WDA API的使用
查看>>
Oracle拆分字符串,字符串分割的函数。
查看>>
可持久化线段树/主席树 基础原理和例题
查看>>
js实现全选checkbox
查看>>
ajax---异步请求对象的属性和方法
查看>>
创意1
查看>>