using
我们用到的库函数基本上都属于命名空间std的,在程序使用的过程中要显示的将这一点标示出来,如std::cout。这个方法比较烦琐,而我们都知道使用using声明则更方便更安全。
using 声明(我们在书写模块功能时,为了防止命名冲突会对模块取命名空间)
using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::
using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域) 。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。
#include <iostream>
class Base {
protected:
int bn1;
int bn2;
};
class Derived : private Base {
public:
using Base::bn1;// 使得成员变量bn1变为publick
};
class DerivedAgain : public Derived {
};
int main() {
Base b;
Derived d;
DerivedAgain da;
b.bn1 = 2;// error, 'bn1' is a private member of 'Base'
d.bn1 = 1;
d.bn2 = 2; //error, 'bn2' is a private member of 'Base'
da.bn1 = 3; //ok
std::cout << d.bn1 << std::endl;
return 0;
}
class Base{
protected:
int bn1;
int bn2;
};
class Derived: private Base{
public:
using Base::bn1; //
};
class DerivedAgain: public Derived{
};
int main(){
Derived d;
DerivedAgain da;
d.bn1 = 1;
d.bn2 = 2; //error, 'bn2' is a private member of 'Base'
da.bn1 = 3; //ok
std::cout<<d.bn1<<std::endl;
return 0;
}
using 指示 (引入命名空间)
using 指示 (using directive) 是使一个命名空间中的 所有 名字都在该作用域中可见的机制。这是最常用的方式了。需要注意的是命名冲突问题。
namespace n1 {
int n1_member = 10;
int m = 11;
}
int m = 12;
int main() {
using namespace n1;
std::cout << n1_member << std::endl;
//std::cout<<m<<std::endl; //error 命名冲突
std::cout << ::m << std::endl;
int m = 13; //ok, 局部变量屏蔽命名空间变量
std::cout << m << std::endl;
return 0;
}
类型重定义,取代 typedef
using alias = typename
typedef std::vector intvec;
using intvec = std::vector; //这两个写法是等价的
头文件
位于头文件的代码一般来说不应该使用using声明。因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明,有可能产生名字冲突。