ampawd Asked:2020-11-29 22:51:21 +0000 UTC2020-11-29 22:51:21 +0000 UTC 2020-11-29 22:51:21 +0000 UTC C++中的匿名类 772 这段代码编译得很好。 class { public: //... } anonymous; 为什么以及出于什么目的使用未命名的类? c++ 2 个回答 Voted Best Answer Vlad from Moscow 2020-11-30T00:17:08Z2020-11-30T00:17:08Z 首先,我想提请您注意一个事实,即在 C++ 中没有带有关键字or的匿名类。您混淆了未命名类和匿名类的概念。这些概念不同,具有不同的语义。在你的问题中,你在谈论未命名的类。classstruct 命名类定义定义命名类型。使用此名称,您可以显式声明此类的成员,在其声明中有类类型说明符、此类型的对象,或者,例如,函数参数。此外,如果名称具有外部链接,那么如果您在这些编译单元中包含此名称的声明,则它将在不同的编译单元中表示相同的实体。 例如,在未命名的类中,不可能声明构造函数、析构函数、具有返回类型的运算符或包含类名的参数类型。 例如,您也不能声明类数据成员是指向类对象的指针或引用。 不允许未命名的类声明该类的静态数据成员。 来自 C++ 标准(9.4.2 静态数据成员) 4 [注意:程序中只能有一个静态数据成员的定义(3.2);无需诊断。--end note ]未命名类和直接或间接包含在未命名类中的类不应包含静态数据成员。 例如,如果您不能在节点定义中声明一个指向下一个或上一个节点的指针的数据成员,您如何声明一个列表节点? 所以无名类的可能性非常有限。 当在定义匿名类的范围之外不需要这样引入的匿名类类型时,通常将匿名类用作其他类的嵌套类或本地类。 Chorkov 2020-11-30T00:59:09Z2020-11-30T00:59:09Z 为了与旧的(没有代码加号的 C)兼容,保留这种可能性。在C中,无名结构和有名结构几乎是等价的,所以很多代码使用:(tyedef struct { int a; int b; } my_type;这样就可以在类型的使用点上改写my_type。struct my_type在C++中,无名类没有实际用途。
首先,我想提请您注意一个事实,即在 C++ 中没有带有关键字or的匿名类。您混淆了未命名类和匿名类的概念。这些概念不同,具有不同的语义。在你的问题中,你在谈论未命名的类。
classstruct命名类定义定义命名类型。使用此名称,您可以显式声明此类的成员,在其声明中有类类型说明符、此类型的对象,或者,例如,函数参数。此外,如果名称具有外部链接,那么如果您在这些编译单元中包含此名称的声明,则它将在不同的编译单元中表示相同的实体。
例如,在未命名的类中,不可能声明构造函数、析构函数、具有返回类型的运算符或包含类名的参数类型。
例如,您也不能声明类数据成员是指向类对象的指针或引用。
不允许未命名的类声明该类的静态数据成员。
来自 C++ 标准(9.4.2 静态数据成员)
例如,如果您不能在节点定义中声明一个指向下一个或上一个节点的指针的数据成员,您如何声明一个列表节点?
所以无名类的可能性非常有限。
当在定义匿名类的范围之外不需要这样引入的匿名类类型时,通常将匿名类用作其他类的嵌套类或本地类。
为了与旧的(没有代码加号的 C)兼容,保留这种可能性。在C中,无名结构和有名结构几乎是等价的,所以很多代码使用:(
tyedef struct { int a; int b; } my_type;这样就可以在类型的使用点上改写my_type。struct my_type在C++中,无名类没有实际用途。