1.目的:解决名称(变量、函数、结构、枚举、类、类和结构的成员)冲突问题
2.核心思想:声明名称的作用域
3.用法
1)名称空间可以是全局的,也可以位于另一个名称空间中。但是不可以在代码块中。
2)访问名称空间中的成员,通过作用域解析运算符::
namespace Jcak{
double pail;
void fetch();
int pal;
}
namespce Jill{
double bucket(double n){...}
double fetch;
int pal;
}
【例】
Jack::pail=12.34;
Jill::pal =12;
4.using声明和using编译
1)using声明
using Jill::fetch;
使特定的标识符可用。在上面的语句中,完成声明后,可以使用fetch代替Jill::fetch。
2)using编译
using namespace Jack;
使整个名称空间可用。内部成员都可以不再使用作用域解析运算符了。
5.using声明和using编译区别
1)using声明时,就好像声明了相应的名称一样。如果某个名称已经在函数中声明了,则不能使用using声明导入相同的名称。
2)using编译时,将进行名称解析,就像在包含using声明和名称空间本身的最小声明区域中声明了名称一样。会导致局部变量将其覆盖。
综上,优先使用using声明。因为,如果发生冲突时编译器会报错;但是使用using编译会覆盖,隐藏危险。
6.using namespace std
1)如果使用iostream,而不是iostream.h,则应该使用下面的名称空间编译指令来使iostream中的定义对程序可用:using namespace std。
2)
如果不适用它,存在问题:
使用两个已经封装好的产品,他们都包含一个相同的函数wanda()。但编译器并不知道具体是哪个函数。
解决方法:
名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以使用名称空间的名称来指出想使用哪个厂商的产品。
举例:A公司将其定义放在一个叫Aspace的名称空间中,其函数全称 Aspace::wanda();B公司将其定义放在一个叫Bspace的名称空间中,其函数全称 Bspace::wanda()。
结论:
类似地,类、函数和变量便是C++编译器的标准组件,他们现在都被放在名称空间std中。当且仅当都文件没有扩展名.h时 情况才是如此。因此,如果没有使用using编译指令,他应该是这么使用:
std::cout<<"come up";
std::cout<<std::endl;
但是,大家喜欢偷懒,于此诞生了这句,它使得std名称空间里的所有名称都可以使用:
using namespace std;
上面这种方法是一种偷懒的方法。更好的方法是,只使能所需要的名称。
using std::cout;
using std::endl;
using std::cin;