命名空间:名称空间(关键字:namespace)被设计来克服无法避免的重复命名的问题,并被
用作额外的信息来区分类似的函数、类、变量等等,它们在不同的库中具有相同的
名称。使用名称空间,可以定义名称的上下文。本质上,名称空间定义了一个范围
定义和使用:namespace A{//定义命名空间A
int i = 10;
}
namespace A{//定义命名空间A,同名的命名空间编译器会合成为一个空间
int j = 20;
}
namespace B{
int k = 30;
namespace C{
int k = 40;
}
}
//引用命名空间,方式一,引入命名空间中的所有内容
using namespace A;
//引用命名空间,方式二,引入命名空间中的指定内容
//using namespace A::i;
int main(){
std::cout << i << std::endl;//打印i,结果:10
std::cout << j << std::endl;//打印j,结果:20
//也可以在方法中引用命名空间
using namespace B;
std::cout << k << std::endl;//打印k,结果:30
//引用命名空间中的命名空间
using namespace B::C;
std::cout << k << std::endl;//打印k,结果:40
}
附:方法体外引用命名空间器作用域是全局的,方法体内引用命名空间是局部的
using的其他作用:
1、定义类型别名
using str = std::string;
using pfn = void(*)();
2、更改访问权限
class Father{
public:
int i = 10;
};
class Son:private Father{
public:
using Father::i;
}
说明:Son私有继承Father后,Father的公有成员被Son继承为私有成员(处自身以外
不可访问),如上例子所示使用using,该私有成员就变为了公有成员,此时外界
可以访问。
3、父类中有多个函数重载,子分类如果要使用所用重载函数,要么不进行重定义,要么全部
重定义,部分重定义则只能使用对应部分重定义的函数。有时子类只需要仅仅重载父类多
个重载函数中的一个函数,并且想要继承其他的版本,在这种情况下可以在派生类中为重
载成员名称提供using声明(将该函数的所有重载实例加到派生类的作用域),使派生类不
用重定义所继承的每一个基类版本。例如: using 父类类名::函数名,用using 声明
将名字加入作用域之后,派生类只需要重定义必须定义的那些函数,对其他版本继承即可。
class Father{
public:
void fn(int i){
std::cout << “Father - ” << i << std::endl;
}
void fn(double d){
std::cout << “Father - ” << d << std::endl;
}
};
class Son:public Father{
public:
using Father::fn;
void fn(int i){
std::cout << “Son - ” << i << std::endl;
}
}