1、成员类型是定义在类内部的类型,包括:typedef 别名;using 别名;enum 枚举;class 嵌套类;struct 嵌套结构体。
#include <vector> #include <list> #include <string> using namespace std; class MyClass { enum Status { Idle, Running, Stopped }; //typedef成员类型别名 typedef vector<int> IntVector; //using成员类型别名 using StringList = list<string>; //嵌套类 class NestedClass { public: void nestedMethod() {} }; //嵌套结构体 struct Point { int x; int y; }; void useMemberTypes() { Status status = Running; IntVector vec; NestedClass nestedClass; Point p = { 1,2 }; } private: Status currentStatus; Point position; };2、在类外使用成员类型时,需要作用域运算符::,而且也遵循访问权限,在类外只能访问public的成员类型,子类可以访问父类的protected成员类型。
class Database { public: enum ConnetStatus { Disconnected, Connecting, Connected, Error }; class Query { public: enum Result {Succ,Failure,Timeout}; }; }; int main() { Database::ConnetStatus connectStatus = Database::ConnetStatus::Connected; Database::Query::Result result = Database::Query::Result::Succ; return 0; }3、为什么需要成员类型?
1、封装和命名空间管理,放在类内部的的成员类型,避免了全局命名冲突;
2、在类内部的成员类型也有访问权限,私有访问权限对实现细节进行隐藏;
3、模板类中的类型别名,在STL中经常使用,type_traits
template<typename T> class Container { public: using value_type = T; using reference_type = T&; using const_reference = const T&; using size_type = std::size_t; class iterator//嵌套的迭代器类型 { //... }; void push_back(const value_type& value); }; //使用 Container<int>::value_type x = 42;总结:
1、成员类型属于类,他们是类的一部分,不是全局的;
2、访问需要作用域:外部使用时,需要加ClassName::
3、访问权限:和其他成员一样,有public/protected/private控制
4、主要用途:组织相关类型;避免命名冲突;隐藏实现细节;提供模板元编程支持;