C++ 命名空间总结

1.命名空间用来干什么?

命名空间是用来处理程序中的同名冲突的。

2.命名空间是什么?

命名空间:实际上就是一个由程序开发者命名的内存区域,开发者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。


3.作用域操作符

假如,有一个命名空间name1

namespace name1

{

   class dataValue

   {

      public:

       int i ;

       double d;

    };

   int valueInt;

   enum

   {

      sunday,

      monday,

      tuesday

     };

}

当在程序中需要用到该命名空间定义的变量时,需要用作用域操作符,限定该变量是来自于哪个命名空间。

即:name1::valueInt = 1;

注意:只能限定命名空间中的定义的成员对象。

例如,在main()函数中:

         name1::dataValue data;

         data.i = 10;

        data.d = 100.0;

这里的data.i和data.d前面就没有用命名空间限定。这是因为,声明data时用的是name1中的对象,表明data是dataValue的类。

在data完成声明了之后,data是属于main()的。并不是属于name1中的对象,所以紧接着对data成员赋值的语句中,就没有出现作用域限定了。

4.使用命名空间成员

方法一:using

比如,上面的程序,可以在包含main()函数的文件中,#include预处理语句之后,加入 using name1::dataValue。

则在上述定义data的时候,就可以直接使用 dataValue data;来完成data的声明了。

但是,此时如果想在main()中使用name1中的sunday,还是得采用name1::sunday。

也就是说,在使用命名空间成员时,不想使用作用域限定符,就必须把每一个即将用到的命名空间成员采用using的方式说明一下。

方法二:using namespace

如果命名空间的成员非常多,采用using的方式,将会写出长长的一系列说明。此时,也可以直接使用using namespace name1,

来代替。使用using namespace,就是说,name1中的成员都可以直接在该文件中使用啦。

注意:直接使用作用域限定符,可以很清楚的知道该成员来自哪个命名空间,不易产生同名的错误。而使用using namespace时,
如果不加注意,很有可能一个文件中使用的多个namespace中就包含了相同名称的成员。。。

5.为什么有的时候需要加上using namespace std,有的时候又不用加呢?

这里有两种情况:

一:头文件名包括后缀.h,如stdio.h,math.h等。

这些头文件是C语言的库函数里面的,由于c语言没有命名空间,头文件并不存放在命名空间中。

因此在c++程序文件中如果用到带后缀.h的头文件时,不必用命名空间。只需在文件中包含所用的头文件即可。

  #include<math.h>

二:c++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。为了表示与c语言的头文件有联系又有区别,c++所用的头文件名是在c语言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如,c语言中有关输入与输出的头文件名为stdio.h在c++中相应的头文件名为cstdio。c语言中的头文件math.h,在c++中相应的头文什名为cmath。c语言中的头文件string.h在c++中相应的头文件名为cstring。注意在c++中,头文件cstnng和头文件strmg不是同一个文件。前者提供c语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明,后者提供c++中对字符串处理的新功能。

  此外,由于这些函数都是在命名空间std中声明的,因此在程序中要对命名空间std作声明。如:

  #include<cstdio>

  #include<cmath>

  usingnamespacestd;




C++ Namespace 详解  

命名空间的定义格式为:(取自C++标准文档)

named-namespace-definition:

       namespace identifier { namespace-body }

unnamed-namespace-definition:

       namespace { namespace-body }

namespace-body:

       declaration-seqopt
--------------------------------------------------

有名的命名空间:

       namespace 命名空间名 {

              声明序列可选

       }

无名的命名空间:

       namespace {

              声明序列可选

       }

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

一 <iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 

后缀为.h的头文件 c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里, c++标准为了 和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 

因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的 c++实现;当使 用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std;这样才能正确使用cout。 

二 所谓 namespace,是指标识符的各种可见范围。 

C++标准程序库中的所有标识符都被定义于一个名为std的 namespace中。 

由于 namespace的概念,使用 C++标准程序库的任何标识符时,可以有三种选择: 

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: 

std::cout << std::hex << 3.4 << std::endl; 

2、使用using关键字。 

using std::cout; 

using std::endl; 


以上程序可以写成 

cout << std::hex << 3.4 << endl; 

3、最方便的就是使用using  namespace std; 

例如: 

#include <iostream> 

#include <sstream> 


#include <string> 


using namespace std; 


这样命名空间std内定义的所有标识符都有效。就好像它们被声明为全局变量一样。那么以上语句可以如下写: 

cout << hex << 3.4 << endl; 

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就 把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的 C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间 下的。 

所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的 C++代码,一 个是为了支持新的标准。 

命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

今天用了VISUAL  C++写了个小程序(VS2005),很简单很简单的,但是就是编译不通过出现一个奇怪的问题:错误 1 error C2668: “max”: 对重载函数的调用不明确

最初代码如下
 

[cpp]  view plain copy
  1. #include    
  2.   using namespace std;   
  3.   template    
  4.   T max (T a,T b)   
  5.   {   
  6.   return ((a>b)?a:b);   
  7.   }   
  8.   void main()   
  9.   {   
  10.   double x,y;   
  11.   cin>>x>>y;   
  12.   cout<<"Max number is "<<(max(x,y))<    
  13.   cin>>x;   
  14.   }  

 

我将这段代码放到VC++ 6.0下竟然通过了,程序运行也正常。这让我百思不得其解。后来终于弄明白了!

其实在std命名空间下还有一个MAX函数,而且实现的功能也是一样的……我昏。利用转到定义功能可以看到微软是怎么写MAX函数的。这里为了不被鄙视就不贴微软的代码了。

明白了为什么出现这个错误我们就改写代码如下:

[cpp]  view plain copy
  1. #include    
  2.  using std::cin;   
  3.  using std::cout;   
  4.  using std::endl;   
  5.  template    
  6.  T max (T a,T b)   
  7.  {   
  8.  return ((a>b)?a:b);   
  9.  }   
  10.  int main()   
  11.  {   
  12.  double x,y;   
  13.  cin>>x>>y;   
  14.  cout<<"Max number is "<<(max(x,y))<    
  15.  cin>>x;   
  16.  }  


这是我比较推荐的做法,因为C++ PRIMER, EFFECTIVE C++上都是用这种方式的,但是谭浩强的书上都是一句using namespace std;就搞定,我觉得蛮简洁的就一直用了,没想到带来那么多的问题,以前在友元函数上还碰到莫名的错误呢。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值