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;
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()
函數中可以使用。