Microsoft C++ 支持嵌套类型的声明 - 命名和匿名。匿名结构和类是 Microsoft 专用 C++ 扩展。匿名联合是标准的。
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
备注
上面的第一个类名称引用了外部类;第二个类名称引用了内部类。这些名称可以进一步嵌套。 因此,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
是类的所有有效名称。使用可选模板关键字让模板标识符代替类名称,如下所示
MyClass<int>::Inner
Outer<int>::template Inner<int>
在某些编程情况下,这对于定义嵌套类型很有意义。 这些类型仅对类类型(在其中定义成员函数)的成员函数可见。 也可以通过使用范围解析运算符 (::) 构造限定类型名称来使其可见。
备注
使用嵌套类型的一个常用类层次结构是 iostream。在 iostream 标头文件中,类 ios 的定义包含一系列枚举类型,它们已被打包以便仅用于 iostream 库。
示例
以下示例定义了嵌套类:
// nested_type_names1.cpp
class WinSystem
{
public:
class Window
{
public:
Window(); // Default constructor.
~Window(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
class CommPort
{
public:
CommPort(); // Default constructor.
~CommPort(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
};
// Initialize WinSystem static members.
int WinSystem::Window::CCount = 0;
int WinSystem::CommPort::CCount = 0;
int main()
{
}
若要访问在嵌套类中定义的名称,请使用范围解析运算符 (::) 构造完整的类名。 此运算符的用法在前面的示例中的 static 成员的初始化中进行了演示。 若要在程序中使用嵌套类,请使用与下类似的代码:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
可按以下方式定义嵌套匿名类或结构:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
匿名类必须是没有成员函数和静态成员的聚合。
结束 Microsoft 专用
备注
虽然可以在类声明中定义枚举类型,但反过来则不然;不能在枚举声明中定义类类型。