使用命名空间
编程过程中有很多的类名和函数名,很容易重复,因此c 引入了命名空间供开发者使用。平时用的最多的 using namespace std
就是指在作用域中使用 stl 库(standard template library)。
using namespace nsp; // 可以使用该命名空间中的内容
// 如果出现没有指明命名空间的函数、变量等都会去该空间中搜索,有符合的就调用
using nsp::function // 作用域中使用 function 函数时,会自动调用该命名空间中的该函数
// 当同一个函数在使用的多个库中有命名重复时,编译器会报错,因为使用的函数是不确定的
namespace nsp1{
void goodbye(){
}
}
namespace nsp2{
void goodbye(){
}
}
using namespace nsp1;
using namespace nsp2;
int main(){
goodbye(); //error: call of overloaded 'goodbye()' is ambiguous
return 0;
}
子类夺取父类成员之你的就是我的 改变父类成员的访问权限
子类继承了父类后,在修饰符(public、protected、private)下使用 using 可访问的父类成员,该成员就相当于是子类在该修饰符下中声明的。
class base{
public:
int _m_base_pub;
protected:
int _m_base_pro;
private:
int _m_base_pri; // 子类 derive 不可对该成员使用 using,因为根本不能访问
};
class derive : base{
// 默认继承(private)
public:
// 原本 _m_base_pub 在默认继承下是私有的,不可通过 derive 对象实例访问,但是子类在 public 修饰符下对他使用了 using,
// 该变量就像是子类自己声明的一样,可以通过子类对象实例访问了
using base::_m_base_pub;
int _m_derive_pub;
protected:
// 原本 _m_base_pro 在默认继承下是私有的,不可派生,子类在 protected 修饰符下对他使用了 using,
// 该变量像是子类自己声明的一样,可以向下派生了
using base::_m_base_pro;
int _m_derive_pro;
private:
int _m_derive_pri;
};
class end : derive{
int a = _m_base_pro;
int b = _m_derive_pro;
};
// base 对象实例可访问的有 _m_base_pub
// derive 对象实例可访问的有 _m_base_pub、_m_derive_pub
// end 对象实例没有可访问的变量!
类型别名
1、相当于 typedef
,但是某种程度上来说 using
要更加直观
// 基本类型别名,两者等价
typedef int myint;
using myint = int;
//声明函数指针类型的别名,使用 using 要直观些,一眼就能看出来 func 是函数指针
typedef void (*func)(void);
using func = void (*)(void);
2、模板别名
template ;
using myvector = std::vector;
//两者等价
vector v;
myvector mv;