首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ using用法

C++ using用法

作者头像
chaibubble
发布2019-09-18 11:14:44
1.4K0
发布2019-09-18 11:14:44
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/chaipp0607/article/details/100128842

#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;

ModuleTypeClassOne的一个别名。 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是个模板,这个typenameusing其实没有什么关系。如果ClassType不是模板的话,这行代码就可以写成:

using ClassType::ModuleType;

剩下的就是using的作用,它引用了基类中的成员ModuleTypeModuleType又是类ClassOne的别名,所以后面ModuleType m;相当于定义对象m,对于子类成员m来说,这样的效果和下面是相同的:

typename ClassType::ModuleType m;

不同之处在于using还修改了基类成员的访问权限,子类ClassThree 私有继承ClassType,所以ClassType中共有成员ModuleType 在子类ClassThree 是私有的,它不能被外部访问。但是使用using后,在main()函数中可以使用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入命名空间
  • 指定别名
  • 在子类中引用基类的成员
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档