命名空间
在C++中命名空间(namespace)的作用:
命名空间,就是为了解决同一个源代码中相同命名的变量或者函数之间相互冲突的问题,就是要避免这种冲突,让程序代码中可以多次使用同一个表述符而存在的。
对于一名开发者而言,代码量过于庞大,或多或少会忘记之间之前用过的变量名或函数名,导致再次定义的时候又用了之前用过的变量名或函数。这样毫无疑问会导致变量名和函数名出现重复定义报错的问题
比如:
int flag = 1; //A声明的变量
// …… //中间间隔若干行代码
bool flag = true; //B声明的变量
这位同学前面使用flag定义为整形数1,用带好A表示,后面又定义为布尔型true,用代号B表示;两者都使用了同一个表述符flag。这样在程序中是不行的,会出现重复定义的错误,无法编译通过。
那么就使用命名空间来解决吧!
如下:
//定义
namespace A
{ //A的变量声明
int flag = 1;
}
namespace B
{ //B的变量声明
bool flag = true;
}
这样,通过定义两个命名空间A和B后,使用的两个flag虽然依旧是两个相同的表述符,但增加了前缀后,表述符所属的范围和意义也就完全不同相互独立了。
在使用这两个表述符的时候记得要加前缀(A::)(B::),这表示完全不相关联的两个表述符
//引用
A::flag = 1; //使用A定义的变量flag
B::flag = true; //使用B定义的变量flag
在C++中通过using声明使用命名空间(namespace):
在c++中除了一对一的引用命名空间以外,还可以通过using范围性的引用!
如下:
//引用
using A::flag; //using表示正在使用,强制无主变量名的引用A命名空间内的对于变量名或函数名
A::flag = 1; //使用A定义的变量flag
B::flag = true; //使用B定义的变量flag
flag = 1; //没有前缀空间命名标识,默认使用A定义的变量flag
using 声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间
//定义
namespace A
{ //A的变量声明
int flag = 1;
int mnt = 2;
}
namespace B
{ //B的变量声明
bool flag = true;
bool mnt = false;
}
//引用
using namespace A; //强制引用A中所有相同表述符
A::flag = 1; //使用A定义的变量flag
B::flag = true; //使用B定义的变量flag
flag = 1; //使用A定义的变量flag
mnt = 2; //默认使用A中的变量2
通常在程序中采用了 using 声明命名空间都具有很强的霸道属性;|
std:using namespace std;
这一语句涵盖了 std 命名空间中的所有标识符,而该命名空间包含 C++ 所有标准库。
有了这一句就可以不需要每次前缀标识而自由使用std默认的所有标准表述符。(常用:cin 、cout 、、、)
解答我的小迷糊:
注意:命名空间和类是两个不同的概念
1、类几乎可以理解为从C语言中过度而来的结构体,只不过结构体内只有变量,而类中不仅仅又成员变量还可以有成员函数;类的后面有分号( ; )
2、命名空间是为了解决同一表述符多次引用的命名冲突问题,本质上只是区分变量名或函数名,命名空间的大括号后面一般没有分号( ; )
3、类是为了组建构成新的数据或函数类型并以此作为一个蓝本,目标是数据和函数类型,作用在本质;而命名空间则完全是为了变量名和函数名服务的,作用在表层,两者之间八竿子打不着,但经常有同学会把两者混淆傻傻分不清。
4、使用命名空间修饰的表述符时候,一定是 空间名:: 变量名(或函数名)
使用类定义对象时,一定是 类名 对象名