C++关键字using

C++关键字using

1.命名空间的声明

指定命名空间后可以省略xxx::的前缀;

比如 std::cout;

只要添加了using namespace std,可以直接写cout

但是这样会造成一些冲突,如果同名函数在不同命名空间类,会造成混乱;

2.子类中引用基类成员

原则:

1.基类中private成员,不可用using声明;

2.基类中protected成员,在子类中public下声明,可被子类对象访问,不能被父类对象访问;其他和封装规则相同;

3.基类中public成员,声明和基类中protected相同;

在继承时,如果是私有继承,子类可以通过using来声明基类中protected方法,不会编译出错;

私有继承有什么用,还未研究;

3.使用using起别名

相当于传统的typedef起别名;

typedef 	std::vector<int> intvec;
using 	intvec	= std::vector<int>;	//这两个写法是等价的

用来定义函数指针,做到左右分离,更清晰;

typedef void (*FP) (int, const std::string&);
using FP = void (*) (int, const std::string&);

对模板的别名,typedef需要包装一层,using可直接使用;

//using
template <typename T>
using Vec = MyVector<T, MyAlloc<T>>;
 
Vec<int> vec;

//typedef
template <typename T>
struct Vec
{
  typedef MyVector<T, MyAlloc<T>> type;
};

Vec<int>::type vec;

使用typedef时,把这样的类型用在模板类或者进行参数传递的时候,你需要使用typename强制指定这样的成员为类型,而不是说这样的::type是一个静态成员亦或者其它情况可以满足这样的语法;

而using则没有这样的问题;

//typedef
template <typename T>
class Widget
{
  typename Vec<T>::type vec;
};

//using
template <typename T>
class Widget
{
  Vec<T> vec;
};
posted @ 2021-10-04 14:37  小紫苏  阅读(821)  评论(0编辑  收藏  举报