关于“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
### C++中 `using namespace std` 的含义与作用 在C++中,`using namespace std` 是一种声明语句,用于简化代码书写。它告诉编译器,在当前作用域内使用 `std` 命名空间中的所有标识符[^1]。这意味着,程序员可以直接使用 `std` 命名空间中的对象、函数和类型,而无需显式地在每个地方加上 `std::` 前缀。 #### 没有 `using namespace std` 的影响 如果没有使用 `using namespace std`,则需要通过命名空间限定符 `std::` 来访问标准库中的元素。例如: ```cpp #include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; } ``` 这种方式虽然显得冗长,但可以明确区分哪些标识符属于标准库,从而减少潜在的命名冲突[^2]。 #### 使用 `using namespace std` 的优点 在日常练习或小型项目中,`using namespace std` 能显著提高编码效率,因为它省去了每次调用标准库元素时都需要写 `std::` 的麻烦。例如: ```cpp #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } ``` 这种写法更加简洁,适合初学者快速上手[^3]。 #### 使用 `using namespace std` 的缺点 尽管 `using namespace std` 提高了编码效率,但它也可能引入命名冲突的风险。当项目规模增大或多个命名空间被引入时,如果定义了与标准库同名的对象、类型或函数,则可能导致编译错误或行为异常[^4]。例如: ```cpp #include <iostream> using namespace std; int main() { int cout = 10; // 定义了一个名为 cout 的变量 cout << "Hello, World!"; // 编译错误:cout 是变量还是 std::cout? return 0; } ``` #### 替代方案 为了避免命名冲突,可以在需要的地方显式导入特定的标识符,而不是整个命名空间。例如: ```cpp #include <iostream> using std::cout; using std::endl; int main() { cout << "Hello, World!" << endl; return 0; } ``` 这种方式既能保持代码简洁,又能避免不必要的命名冲突。 ### 总结 `using namespace std` 是C++中的一种便捷声明,用于简化对标准库中标识符的访问。然而,它的使用应根据具体场景权衡利弊。在小型项目或学习阶段,可以直接使用 `using namespace std`;而在大型项目中,建议采用更精确的方式(如 `std::cout` 或 `using std::cout`)以降低命名冲突的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值