【C++】using的三种用法 | 转载
慕雪的小助手正在绞尽脑汁···
慕雪小助手的总结
DeepSeek & LongCat
C++ using的三种用法,这个之前还没有接触过
示例
1 |
|
在上面代码中,一共有三处使用了using,分别是第3,16,22行,它们的作用为:
- 引入命名空间
- 指定别名
- 在子类中引用基类的成员
引入命名空间
指定命名空间是C++ using namespace中最常被用到的地方,在第3行中的:
1 | using namespace std; |
指定别名
using的另一个作用是指定别名,一般都是using a = b;这样的形式出现,比如在13行中:
1 | using ModuleType = ClassOne; |
ModuleType 是ClassOne的一个别名。
using这个作用也比较常见,比如在vector.h中就有:
1 | template<class _Ty,class _Alloc = allocator<_Ty>>class vector: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc>> |
即value_type 是_Ty的一个别名,value_type a; 和_Ty a;是同样的效果。
可以理解为C++中的
typedef
在子类中引用基类的成员
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()函数中可以使用。
1 | 版权声明:本文为博主原创文章,遵循 [CC 4.0 BY-SA] 版权协议,转载请附上原文出处链接和本声明。 |
评论



