C++ using用法

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 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()函數中可以使用。