在使用
using namespace std; 是什么意思呢?
直接翻译过来,就是使用 名字空间(名称空间) std;
通过这条语句,我们就能使用std空间里的名称,比如cout,cin.
那么除了“using namespace std”这句能让我们使用std中的名称(cin,cout等),using namespace 还能干什么呢?
翻阅了c++primer plus(6)的9.3(名称空间)之后,对这个 namespace 有了一些了解。
第一个问题,名称空间是干什么的?为什么要造一个名称空间?
名称冲突!
举一个例子,有两个库都包含一个叫List的类,
而我们使用List类的时候,就会有两个叫List的类,
但是我们只想用第一个库的List,怎么办呢?
为了避免这个问题(名称冲突/重复),c++提供了名称空间。
第二个问题,命名空间是怎么规定的?
书上写的比较多,看起来也比较复杂,不感兴趣的可以跳过这一部分。。。
书上先从传统c++名称空间说起。介绍了两个概念:声明区域 和 潜在作用域。
声明区域书上说了几行,简单来说就是可以使用某个(已声明的)名称的区域。
举个例子,我在一个函数体内声明了一个变量,那么其 声明区域 就是 函数体内。
潜在作用域。书上说是:变量的潜在作用域从声明点开始,到其声明区域的结尾。潜在作用域比声明作用域小。
变量在潜在作用域并非都可见。比如函数中的局部变量同名时,全局变量就会被隐藏。
接着,有讲了c++新的名称空间特性。
c++新增了一个功能,定义一个新的声明区域 来 创建命名的 名称空间。
目的是提供一个声明名称 的区域。
然后给了一个例子
namespace Jack {
double pail;
void fetch();
int pal;
struct Well {};
}
namespace Jill {
double bucket(double n) { return n; }
double fetch;
int pal;
struct Hill{ };
}
命名空间的开放的,可以把名称加入进去。
namespace Jill {
char * goose(const char *);
}
namespace Jack {
void fetch()
{}
}
访问名称空间的名称可以通过 作用域解析运算符(::)
Jack::pail = 12.34;
Jill::fetch = 11;
using声明
简化对名称的使用。 using 声明使特定的标识符可用。如
using Jill::fetch;
之后只要使用fetch就可表示Jill::fetch
using编译指令
using 编译指令使 一个名称空间的所有名称都可用。如
using namespace Jack;
使用using会简化对名称的使用,也会增加名称冲突的可能性。
总之,名称空间是为了避免名称冲突。但是即使使用了名称空间,如果同时使用多个using编译指令时,也会有很大的可能出现冲突。
为了避免名称冲突,最好 减少使用using编译指令 。
最好使用using声明,只声明特定的需要的名称(如using std::cout)。或者使用解析运算符(::)。