zoukankan      html  css  js  c++  java
  • C++ 中using 的使用

    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

         https://blog.csdn.net/jingerppp/article/details/78742459

  • 相关阅读:
    如何发现需求
    测试linux和window下 jdk最大能使用多大内存
    java获取汉字的拼音 简单版
    oracle一条sql执行导入sql文件
    oracle使用闪回功能恢复删除的表数据
    linux环境变量配置
    有两张表;使用SQL查询,查询所有的客户订单日期最新的前五条订单记录。 糖不苦
    jQuery作业 点击出弹框 糖不苦
    #{}和${}的区别是什么? 糖不苦
    在html页面中如何使用jQuery? 糖不苦
  • 原文地址:https://www.cnblogs.com/2018shawn/p/13565172.html
Copyright © 2011-2022 走看看