Можно ли использовать анонимные классы в C++?
Я видел анонимные занятия в C++
код на Quora. Он успешно скомпилирован и запущен.
Код здесь:
#include <iostream>
auto func()
{
class // no name
{
public:
int val;
} a;
a.val = 5;
return a;
}
int main()
{
std::cout << func().val << std::endl;
return 0;
}
Итак, действительно ли это в C++?
Кроме того, мне интересно знать, возможно ли использовать анонимные классы в C++?
3 ответа
В C++ анонимный союз - это объединение этой формы:
union { ... } ;
Он определяет безымянный объект безымянного типа. Его члены вводятся в окружающий объем, так что к ним можно обращаться, не используя <object>.
префикс, который в противном случае был бы необходим.
В этом смысле не существует анонимных классов (которые не являются объединениями - в C++ объединения являются классами).
С другой стороны, безымянные классы (включая структуры и союзы) не являются чем-то необычным.
union { ... } x;
class { ... } y;
typedef struct { ... } z;
x
а также y
именуются объекты безымянных типов. z
является typedef-именем, которое является псевдонимом для неназванной структуры. Они не называются анонимными, потому что этот термин зарезервирован для вышеуказанной формы объединения.
[](){}
Лямбды являются безымянными объектами безымянных типов классов, но они также не называются анонимными.
Мало того, вы можете создать больше экземпляров класса с помощью decltype
,
#include <iostream>
class
{
public:
int val;
} a;
int main()
{
decltype(a) b;
a.val = 10;
b.val = 20;
std::cout << a.val << std::endl;
std::cout << b.val << std::endl;
return 0;
}
Выход:
10
20
Всегда можно было написать что-то вроде этого:
typedef struct { int a; } type;
Теперь, если вы посмотрите на struct { int a }
часть, это анонимная структура. В C++ нет принципиальной разницы между структурами и классами (за исключением модификаторов доступа по умолчанию). Таким образом, возможно иметь анонимные структуры / классы.