C++ using namespace std 详解

C++ using namespace std
2008-12-23 22:19


熟练掌握C/C++语言,熟悉Windows开发平台,能熟练运用MFC自主编开发出一些应用程序;
熟练掌握SQL语句,对数据库有很好的认识,能熟练使用SQL Server2000软件;
熟练掌握JAVA语言,熟悉J2ME对手机软件开发一定的基础;
深入理解面向对象的思想,并能熟练应用于具体的程序设计开发中;
熟悉Unix/Linux下C语言的编程以及常用的命令,熟悉汇编语言;
熟悉网络的TCP/IP、UDP等协议,能处理解决电脑系统软件常见的故障;

 

C++ using namespace std 详解
 所谓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"

[收藏]using namespace std 的用法
点击数:6759    发布日期:2005-12-5 15:12:00
【收藏】 【评论】 【打印】 【编程爱好者论坛】 【关闭】



using namespace std 的用法

摘自

using namespace std;用的并不少!   
---------------------------------------------------------------

实际上就是告诉编译器,你类型是什么,在哪能找到。

常用的是using namespace std,就是说用C++的标准名字空间。

你也可以引用你自己的名字空间。比如说:

import "C://MyTest//test.tlb"
using namespace CMyTest

就可以引用CMyTest内的各个类型名

看C++ prime
---------------------------------------------------------------

声明该文件使用C++标准库吧!
比如
#include <iostream>
using namespace std;
void main()
{
   cout << "hello!" << endl;
}

如果不用using namespace std;这句,那么
std::cout << "hello!" <<endl;
这是名字空间的问题!具体参看有关书籍吧,新版的C++ 书应该都有介绍的!

---------------------------------------------------------------

using 指示符!
这是个名字空间问题,是标准C++引入的新概念!
具体在《C++Primer》第8.6节有详细说明!
---------------------------------------------------------------

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

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

名字空间,实质上也是为了方便程序在不同平台上正确的运行。
---------------------------------------------------------------

namespace是为了解决C++中的名字冲突而引入的。
什么是名字冲突呢?比如,在文件x.h中有个类MyClass,
在文件y.h中也有个类MyClass,而在文件z.cpp中要同时
引用x.h和y.h文件。显然,按通常的方法是行不能的,
那怎么办呢?引入namespace即可。例如:
       在x.h中的内容为
// x.h
namespace MyNamespace1
{
   class MyClass
   {
   public:
       void f();
   private:
       int m;
   }
};

       在y.h中的内容为
// y.h
namespace MyNamespace2
{
   class MyClass
   {
   public:
       void f();
   private:
       int m;
   }
};

   然后在z.cpp中引入x.h和y.h
// z.cpp
#include "x.h"   
#include "y.h"   

void z::f()
{
   //声明一个文件x.h中类MyClass的实例x
   MyNamespace1::MyClass x;
     //声明一个文件x.h中类MyClass的实例x
   MyNamespace2::MyClass y;

   //调用文件x.h中的函数f
   x.f();
   //调用文件y.h中的函数f
   y.f();
}
       名字空间实质上是一个作用域。
       通过上面的一个实例应该知道名字空间的作用了吧

尽量不要使用using namespace std;VC++2005使用有感
Posted on 2007-11-06 20:28 Samson小天 阅读(1163) 评论(6) 编辑 收藏 网摘 所属分类: C++/C++.net
今天用了VISUAL C++写了个小程序(VS2005),很简单很简单的,但是就是编译不通过
出现一个奇怪的问题:错误 1 error C2668: “max”: 对重载函数的调用不明确

最初代码如下

#include <iostream>
using namespace std;

template <typename T>
T max (T a,T b)
{
return ((a>b)?a:b);
}
void main()
{
double x,y;
cin>>x>>y;
cout<<"Max number is "<<(max(x,y))<<endl;
cin>>x;
}

    我将这段代码放到VC++ 6.0下竟然通过了,程序运行也正常。这让我百思不得其解。后来终于弄明白了!
    其实在std命名空间下还有一个MAX函数,而且实现的功能也是一样的……我昏。利用转到定义功能可以看到微软是怎么写MAX函数的。这里为了不被鄙视就不贴微软的代码了。
    明白了为什么出现这个错误我们就改写代码如下:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

template <typename T>
T max (T a,T b)
{
return ((a>b)?a:b);
}
int main()
{
double x,y;
cin>>x>>y;
cout<<"Max number is "<<(max(x,y))<<endl;
cin>>x;
}
    这是我比较推荐的做法,因为C++ PRIMER, EFFECTIVE C++上都是用这种方式的,但是谭浩强的书上都是一句using namespace std;就搞定,我觉得蛮简洁的就一直用了,没想到带来那么多的问题,以前在友元函数上还碰到莫名的错误呢。
    其实还有两个简单的解决方案,那就是把自己定义的函数改成其他的名字,或者直接用微软提供的函数。相信微软提供的效率绝对不会比我们写的低~
    好了,就写到这了。希望大家养成良好的编程习惯,^-^

很多C++程序员还在使用而不是用更新的标准的库。
这两者都有什么不同呢?首先,5年前我们就开始反对把.h符号继续用在标准的头
文件中。继续使用过时的规则可不是个好的方法。从功能性的角度来讲,
<iostream>包含了一系列模板化的I/O类,相反地<iostream.h>只仅仅是支持字符
流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此,
<iostream>和<iostream.h>在接口和执行上都是不同的。最后,<iostream>的各组
成都是以STL的形式声明的,然而<iostream.h>的各组成都是声明成全局型的。

因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习
惯,在新的代码中一般使用<iostream>,但如果你处理的是过去编写的代码,为了
继承可以用继续用<iostream.h>旧保持代码的一致性。

 

///////////////////

<iostream>表示你使用的是标注命名空间,也就是在程序开始应该有这么一句话
using namespace std ;
这是遵循c++标准的
<iostream.h>
则没有遵循c++标准
////////////////
<string.h>是旧的C头文件,对应的是基于char*的字符串处理函数;
<string>是包装了std的C++头文件,对应的是新的strng类;
<cstring>是对应旧的C头文件的std版本。


在C++语言编写的程序中,变量和函数等的作用范围是有一定限制的。比如,在函数体中定义的一个临时变量就不可以在函数体外使用。为了解决变量和函数等的作用范围,在C++语言中引入了名空间的概念,并增加了关键字namespace和using  
          在一个名空间中可以定义一组变量和函数,这些变量和函数的作用范围一致,可以将这些变量和函数称为这个名空间的成员。  
          通过名空间,可以在同一个文件中使用相同的变量名或函数名,只要它们属于不同的名空间。另外,名空间可以使得代码操作具有相同名字但属于不同库的变量。而且,名空间也可以提高C语言与C++语言的兼容性。  
   
下面通过例程说明关键字namespace的用法。  
#include   <conio.h>  
#include   <iostream.h>  
namespace   car   //   名空间的定义  
{  
      int   model;  
      int   length;  
      int   width;  
}  
   
namespace   plane  
{  
      int   model;  
      namespace   size   //   名空间的嵌套  
      {  
          int   length;  
          int   width;  
      }  
}  
   
namespace   car   //   添加名空间的成员  
{  
      char   *   name;  
}  
   
namespace   c=car;   //   定义名空间的别名  
int   Time;   //   外部变量属于全局名空间  
   
void   main()  
{  
      car::length=3;  
      //   下面一句错误,故屏蔽掉  
      //   width=2;   //   对于非全局变量和当前有效临时变量应该指定名空间  
      plane::size::length=70;  
      cout<<"the   length   of   plane   is   "<<plane::size::length<<"m."<<endl;  
      cout<<"the   length   of   car   is   "<<car::length<<"m."<<endl;  
      //   使用名空间的别名  
      cout<<"the   length   of   c   is   "<<c::length<<"m."<<endl;  
      int   Time=1996;   //   临时变量,应区别于全局变量  
      ::Time=1997;  
      cout<<"Temp   Time   is   "<<Time<<endl;  
      cout<<"Outer   Time   is   "<<::Time<<endl;  
      //   使用关键字using  
      using   namespace   plane;  
      model=202;  
      size::length=93;  
      cout<<model<<endl;  
      cout<<size::length<<endl;  
      getch();  
}  
   
运行结果:  
the   length   of   plane   is   70m.  
the   length   of   car   is   3m.  
the   length   of   c   is   3m.  
Temp   Time   is   1996  
Outer   Time   is   1997  
   
说明:  
&#8226;   从上面可以看出,名空间定义了一组变量和函数,它们具有相同的作用范围。对于不同的  
      名空间,可以定义相同的变量名或函数名,在使用的时候,只要在变量名或函数名前区分  
      开不同的名空间就可以了。  
&#8226;   名空间可以被嵌套定义,使用时要逐级对成员用名空间限定符:   :来引用。  
&#8226;   系统默认有一个全局名空间,它包含了所有的外部变量。这个名空间没有名字,引用这个  
      名空间里的变量时要使用名空间限定符:   :,前面没有名字。在不使用名空间的情况下,我  
      们知道,不可以在不同文件中定义相同名字的外部变量,这是因为它们属于同一个全局名  
      空间,名字不可以重复。  
&#8226;   可以给名空间取一个别名。一般别名是一个比较短的名字,来简化编程。  
&#8226;   在原有定义好的名空间的基础上,随时可以往里增加成员。  
   
<<using>>  
在前面的例程中可以看到,为了使用时的方便,又引入了关键字using。利用using声明可以在引用名空间成员时不必使用名空间限定符::。此外,关键字namespace和using的使用,对函数重载有一定的影响。  
   
下面通过例程进行具体说明。  
#include   <conio.h>  
#include   <iostream.h>  
namespace   car   //   名空间的定义  
{  
      void   ShowLength(double   len)   //   参数类型为d   o   u   b   l   e  
      {  
          cout<<"in   car   namespace:   "<<len<<endl;  
      }  
}  
   
namespace   plane   //   名空间的定义  
{  
      void   ShowLength(int   len)   //   参数类型为i   n   t  
      {    
          cout<<"in   plane   namespace:   "<<len<<endl;  
      }  
}  
   
void   main()  
{  
      using   namespace   car;  
      ShowLength(3);  
      ShowLength(3.8);  
      using   namespace   plane;  
      ShowLength(93);  
      ShowLength(93.75);  
      getch();  
}  
   
运行结果:  
in   car   namespace:   3  
in   car   namespace:   3.8  
in   plane   namespace:   93  
in   car   namespace:   93.75  
   
说明:  
          如果没有名空间的干扰,函数重载时选择规则将是非常简单。只要实参是double类型,则调用的是前面的函数;如果实参是int类型,则调用后面的函数。但是由于名空间的参与,就出现了上面的运行结果。所以在编程的时候一定要注意名空间对函数重载的影响。  
   
   
          应注意:调用函数时,如果实参和形参的数据类型实在没有办法完全匹配,可能会对实参进行适当的数据类型转换。比如,将char类型转换为int类型,或进一步将int类型转换为double类型。这种是将数据类型从简单往复杂转换,一般不会丢失信息。另外一种转换是反过来,将double类型转换为int类型,或进一步将int类型转换为char类型。这种是将数据类型从复杂往简单转换,可能会丢失部分信息。在调用函数的时候,不同的情况下,C++对上述两种转换的优先级是不同的。当引入了名空间后,则参与了上述优先级顺序的分配。

你可能感兴趣的:(C++ using namespace std 详解)