在C++中出现了命名空间的概念,namespace是关键字,初学者就可以理解为和int,double,char一样的类型关键字。之所以出现这个概念,是因为C++(c plus plus)作为C语言的加强版,是为了处理更大型的项目,这样就会出现更多的变量名,为了避免名称冲突和更好的控制变量的作用域,故设计此概念。
那么,我们回头去看我们的第一个c++程序
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
return 0;
}
头文件iostream包含了我们C++的标准的输入输出流,而对于C++的标准库而言,其对应的名字空间的名字为std,标准库的组件都在名字空间std中定义。
所以在代码之初我们写这样一段话,就是告诉编译器,我们的cout是用名为std(Standard)这个命名空间里的内容。
有点类似与我们C语言中的结构体定义,定义命名空间,需要使用到namespace关键字,而后再加入{}花括号 如下:
namespace spaceA
{
int a=5;
}
再空间A中定义了一个整型a。
在这里需要注意,命名空间的使用与C语言的函数有相似的地方,命名空间需要先定义再使用,不能颠倒,否则程序会报错。
//错误示范
using namespace std;
using namespace spaceA;
namespace spaceA
{
int a=5;
}
当然了,命名空间中可以定义的不仅仅可以是整型,我们已知的基本的数据类型,函数,结构体,命名空间都是可以的,。
先上代码
#include<iostream>
using namespace std;
namespace spaceA
{
int a=5;
int b=10;
}
using namespace spaceA;
int main()
{
cout<<a<<"和"<<b<<endl;
return 0;
}
这段代码的运行结果是5和10,相信不难理解。
这是一种引用命名空间中成员的方式简单粗暴,将空间A全部展开,进而可以访问到其中的a,b。
当然这种方式也有弊端,如果空间中声明的变量过多,容易造成与其他空间定义的内容造成重复定义。(初学者可以忽略不计)
#include<iostream>
using namespace std;
namespace spaceA
{
int a=5;
int b=10;
}
int main()
{
cout<<spaceA::a<<endl;
return 0;
}
这段代码的运行结果是5。
这个"::"叫做作用域限定符,其作用是告诉编译器应从作用域限定符左侧的名字所示的命名空间中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。
如果只是只想使用a这个变量,也可以如此使用,但是这样写声明一次只能在本条语句有效,每次引用都要写,使用起来比较繁琐。
#include<iostream>
using namespace std;
namespace spaceA
{
int a=5;
int b=10;
}
using spaceA::b;
int main()
{
printf("%d\n", spaceA::a);
printf("%d\n", b);
return 0;
}
这段代码的运行结果是5? 10。
在全局中声明了使用的b变量是spaceA中声明的。这样b变量在主函数中也就可以正常使用。
由此段代码也可以看出,C++是兼容C语言的,在C++文件中写C语句也是可以的。
#include<iostream>
using namespace std;
namespace spaceA
{
namespace spaceB
{
int a=5;
}
}
using namespace spaceA::spaceB;
int main()
{
cout<<a<<endl;
return 0;
}
这段代码的运行结果是 5.
等于是告诉编译器,我们引用的a变量实在空间A中定义的空间B中的a,既然空间A包含了空间B,那能否将spaceA::spaceB改为只有spaceA,答案是否定的。
请看以下代码
#include<iostream>
using namespace std;
namespace spaceA
{
namespace spaceB
{
int a=5;
}
namespace spaceC
{
int a=5;
}
}
using namespace spaceA::spaceB;
int main()
{
cout<<a<<endl;
return 0;
}
如果在空间A中出现空间C,而且其中也有变量a,那么此时编译器就蒙圈了,它无法确定你所使用的变量a具体是那个。
所以应用命名空间中的内容,一定要交代清楚具体未知,引用的位置要写道底。
namespace,命名空间是我们在初学C++所接触的第一个全新的内容,积水成渊,加油。