C++命名空间
命名空间:
#include<stdafx.h> //预编译头,项目自带的,编译器编译这个项目,对于大型项目,如果改变了一个程序之后,编译器只会编译改变的那个程序,不会将所有的程序都编译一下,可以加快速度,如果不要该头文件也是可以的,需要在项目属性中取消预编译头
#include<iostream> //输入输出流 cout << cin >>
Using namespace std; //这是使用的系统中的名字叫做std的命名空间
那么如何定义命名空间呢?
Namespace zhangsan
{
//可以定义变量、函数、类、结构体,都行
Int age;
}
使用命名空间中的变量:
第一种 zhangsan::变量名
第二种 using zhangsan::变量名
表示从这句话开始,以下所有的该变量都是使用zhangsan中的变量 ,并且不可以重新定义
第三种 using namespace zhangsan(放在局部);
表示从这句话开始使用的变量会在zhangsan命名空间中找
第四种 将using namaspace zhangsan;语句直接放在全局中(最正常的人使用)
:: 限定符表示后面的变量是属于哪个空间中的
如果在命名空间中有一个fun()函数,然后还有一个全局的函数fun()那么,并且还有 using namaspace zhangsan;这一句话,这时你如果在main函数中调用fun();的话肯定是不行的,因为编译器会不知道你要使用的是哪一个的fun()
那么你可以这样使用全局中的fun()函数
::fun(); //:: 作用说明是全局的
这样使用命名空间中的fun()函数
Zhangsan::fun();
注意:命名空间不可以在局部进行定义,可以在局部进行使用
另外还需要注意的是局部中定义的变量和全局命名空间(指的是using namespace zhangsan;这句话放在了主函数外边)中的是不冲突的,编译器会采取就近原则进行使用
这样的是不可以的
这样的是可以的
这样也是可以的,并不冲突
在一个程序中是可以使用多个命名空间的,但是要注意尽量避免不要连续声明多个命名空间,因为可能会出现冲突
命名空间的嵌套:
命名空间的合并:
可以定义重复名字的命名空间,这样就会将两个合成一个进行处理
Namaspace {
Int age=10;
}
这样的就是全局命名空间和static是类似的,只可以在当前问文件中使用
如何使用全局命名空间中的变量:
Cout<<age<<endl;或者cout<<::age<<endl;
那么如果在来一个全局变量
Int age=30;
这样的也是可以的,因为全局命名空间中的age在{}之中的,和全局变量age并不冲突
但是在使用的时候必须加上限定符::并且使用的是全局的age,不是namespace中的age,吧并且namespace中的age是无法再被访问了
如果有这样的命名空间:
Namaspace zhangsan
{
Int age=1;
Namespace lisi
{
Int age=2;
Namespace wangwu
{
Int age=3;
}
}
}
那么就需要一步一步的进行访问:
访问wangwu中的age zhangsan::lisi::wangwu::age;
或者这样:
Namespace MM=zhangsan::lisi::wagnwu;
MM::age;
注意不可以使用typedef zhangsan::lisi::wangwu;因为typedef只可以重定义数据类型