关于using namespace std

来源:互联网 发布:模拟人生4作弊码mac 编辑:程序博客网 时间:2024/05/28 09:33

在学习C++的道路上,我发现了一个很奇怪的现象。以前在使用谭浩强老师的书是,发现他特别喜欢使用using namespace std,就是命名空间这个写法。然后当我开始学习C++ primer这本书时,貌似翻遍整个书本,都没有看到关于命名空间的解释与概念。
先回顾一下标识符的概念。C++的标识符(identifier)由字母,数字,和下面线组成,但是C++语言中保留了一些名字供语言本身使用,这些名字不能被用作标识符。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。

比如在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。此时,很有可能,其中一个库中的名称和另外一个库中的名称是相同的,这样就冲突了。这种情况会经常发生在类的名称上。比如,我们在自己的程序中定义了一个Stack类,而我们程序中使用的某个库中也可能定义了一个同名的类,此时名称就冲突了。

Namespace关键字的出现就是针对这种问题的。由于这种机制对于声明于其中的名称都进行了本地化,就使得相同的名称可以在不同的上下文中使用,而不会引起名称的冲突。或许命名空间最大的受益者就是C++中的标准库了。在命名空间出现之前,整个C++库都是定义在全局命名空间中的(这当然也是唯一的命名空间)。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。这样就减少了名称冲突的可能性。我们也可以在自己的程序中创建自己的命名空间,这样可以对我们认为可能导致冲突的名称进行本地化。这点在我们创建类或者是函数库的时候是特别重要的。

C++标准程序库中的所有标识符都被定义于一个名为std的Namespace中。Namespace是指标识符的各种可见范围。命名空间用关键字namespace来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
C++标准程序库中的所有标识符都被定义于一个名为std的Namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1.直接指定标识符

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

2.使用using关键字

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

3.使用using namespace std

#include<iostream>#include<sstream>#include<string>using namespace std;

关于第三种方法,初学者应该都会喜欢用吧。但是这个写法在大的工程上会出现很大的问题,比如:

using namespace foo;using namespace bar;

一切都有序进行,你可以从Foo中调用Blah,可以从Quux调用Bar。
但是有一天,你升级了Foo,在Foo中也声明了一个Quux函数,这样问题就来了,两个函数就会冲突了。

谢谢博览群书1989

0 0
原创粉丝点击