C++ 中using 的使用
#include <iostream> using namespace std; class ClassOne { public: int w; protected: int a; }; class ClassTwo { public: using ModuleType = ClassOne; }; template <typename ClassType>class ClassThree : private ClassType { public: using typename ClassType::ModuleType; ModuleType m; ClassThree() = default; virtual ~ClassThree() = default; }; void main() { ClassThree<ClassTwo>::ModuleType a; }
在上面代码中,一共有三处使用了using
,分别是第3,16,22行,它们的作用为:
- 引入命名空间
- 指定别名
- 在子类中引用基类的成员
引入命名空间
指定命名空间是C++ using namespace
中最常被用到的地方,在第3行中的:
using namespace std;
指定别名
using
的另一个作用是指定别名,一般都是using a = b;
这样的形式出现,比如在13行中:
using ModuleType = ClassOne;
ModuleType
是ClassOne
的一个别名。using
这个作用也比较常见,比如在vector.h中就有:
template<class _Ty,class _Alloc = allocator<_Ty>>class vector: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc>> { public: using value_type = _Ty; using allocator_type = _Alloc; }
即value_type
是_Ty
的一个别名, value_type a; 和 _Ty a; 是同样的效果。
在子类中引用基类的成员
using
的第三个作用是子类中引用基类的成员,一般都是using CBase::a;
这样的形式出现,比如在22行中:
using typename ClassType::ModuleType;
它和一般形式有些区别,就是它加了个typename
修饰,这是因为类ClassThree
本身是个模板类,它的基类ClassType
是个模板,这个typename
和using
其实没有什么关系。如果ClassType
不是模板的话,这行代码就可以写成:
using ClassType::ModuleType;
剩下的就是using的作用,它引用了基类中的成员ModuleType
, ModuleType
又是类ClassOne
的别名,所以后面ModuleType m;
相当于定义对象m,对于子类成员m来说,这样的效果和下面是相同的:
typename ClassType::ModuleType m;
不同之处在于using
还修改了基类成员的访问权限,子类ClassThree
私有继承ClassType
,所以ClassType
中共有成员ModuleType
在子类ClassThree
是私有的,它不能被外部访问。但是使用using
后,在main()
函数中可以使用。
参考链接:https://blog.csdn.net/chaipp0607/article/details/100128842