C++笔记(三)——命名空间

客官°小女子只卖身不卖艺 2022-05-19 12:30 319阅读 0赞

定义和使用命名空间

  1. 在一个应用程序的多个文件中可能会存在同名的全局对象,这样会导致应用程序的链接错误。使用命名空间是**消除命名冲突**的最佳方式。

命名空间的定义格式为:







namespace 名称

{

      常量、变量、函数等对象的定义

}

1. 如果使用命名空间中的对象,需要在对象前使用命名空间名作为前缀。

2. 如果需要访问同一个命名空间中的多个对象,可以使用**using**命令引用整个命名空间对象,这样就不必在每个对象前添加命名空间前缀了。

3. using**命名的作用域从当前引用处到当前作用域的结束。如果将using命名放置在复合语句中,在复合语句结束时,using名的作用域也结束了。**

4. 如果在函数中定义的局部变量与命名空间中的变量同名时,命名空间中的变量被隐藏。

5. 对于同一个命名空间,可以在多个文件中定义。

关于“using namespace std”

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

  1. 关于namespace

  C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法就是加上自己的命名空间。比如下面的例子:

  1. #include <iostream>
  2. using namespace std;
  3. namespace ZhangSan
  4. {
  5. int a=10; //张三把10赋值给了变量a
  6. }
  7. namespace LiSi
  8. {
  9. int a=5; //李四把10赋值给了变量a
  10. }
  11. void main()
  12. {
  13. int a=1;
  14. cout<<"张三定义的a="<<ZhangSan::a<<endl;
  15. cout<<"李四定义的a="<<LiSi::a<<endl;
  16. cout<<"主函数定义的a="<<a<<endl;
  17. }

  上例中的“ZhangSan::a”和“LiSi::a”分别表示了调用张三命名空间中的a变量和李四命名空间中的a变量。这样的好处显而易见,那就是虽然张三和李四这两个程序员都定义了一个变量a,但是并不会出现重名的危险。

运行结果为:

2011071013021232.png

  2. 关于using namespace *

  顾名思义,using namespace * 就表示释放命名空间* 中间的东西。好处在于我们在程序里面就不用在每个函数的头上都加上*::来调用。比如说如果上面那个程序,如果我们不在using namespace std,那么我们就需要在主函数中的标准输出流cout函数前面加上std,写成

std::cout

表示调用std空间里面的标准输出流cout。但是有些时候我们也不能图这个方便,比如说如果在主函数中将命名空间ZhangSan和LiSi的中所定义的变量释放出来,如下例1:

  1. #include <iostream>
  2. using namespace std;
  3. namespace ZhangSan
  4. {
  5. int a=10; //张三把10赋值给了变量a
  6. }
  7. namespace LiSi
  8. {
  9. int a=5; //李四把10赋值给了变量a
  10. }
  11. void main()
  12. {
  13. int a=1;
  14. using namespace ZhangSan;
  15. using namespace LiSi;
  16. cout<<a<<endl;
  17. }

这个程序输出结果为:

2011071013303734.png

如果我们在主函数中把 int a=1给删除,如下例2:

  1. #include <iostream>
  2. using namespace std;
  3. namespace ZhangSan
  4. {
  5. int a=10; //张三把10赋值给了变量a
  6. }
  7. namespace LiSi
  8. {
  9. int a=5; //李四把10赋值给了变量a
  10. }
  11. void main()
  12. {
  13. using namespace ZhangSan;
  14. using namespace LiSi;
  15. cout<<a<<endl;
  16. }

会发现根本就不会通过编译,输出的错误信息为:

  1. error C2872: a”: 不明确的符号

  分析可以看出,上面这个例2会引起歧义。因为ZhangSan中间的a被释放出来,同理LiSi中间的a也被释放出来了。那么编译器就不知道到底哪个才是需要输出的a,自然就会引起歧义了。同理,在例1中,编译器同样不知道到底哪个才是需要输出的a,于是它只采用了主函数中自己定义的a,这样程序也不会报错,但是只会输出1,自然结果就如上面的图所示了。

转自:http://www.cnblogs.com/uniqueliu/archive/2011/07/10/2102238.html

发表评论

表情:
评论列表 (有 0 条评论,319人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 命名空间

    C++ 命名空间 假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们

    相关 C++命名空间

    本讲基本要求 \ 掌握:命名空间的作用及定义;如何使用命名空间。 \ 了解:使用早期的函数库 重点、难点 ◆命名空间的作用及定义;如何使用命名空间。 在学习本书

    相关 C++命名空间

    一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突。 在 C语言中定义了3个层次的作用域,即文件(编

    相关 C++命名空间

    命名空间支持是C++的一项特性,加入你有A和B两个地方提供的函数但是名字都叫fun(),这样使用fun()的时候,编译器就不知道该用哪个了。命名空间能够让程序员把函数封装在一个

    相关 C++命名空间

    概述       在C语言中程序的全局变量作用域只有一个,所有的全局标识符都共享同一个作用域,在多人开发的时候,容易造成标识符冲突。C++为了解决这个问题提出了命名空间这

    相关 C++命名空间

    在 C++ 中,名称( name )可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的 C++ 库时,这些标识

    相关 C++命名空间

    本讲基本要求      \ 掌握:命名空间的作用及定义;如何使用命名空间。      \ 了解:使用早期的函数库  重点、难点      ◆命名空间的作用及定义;