Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Анонимные классы в c++

#c++ #классы #c++11 #объявление


Этот код вполне себе нормально компилируется.

class 
{ 
   public:
   //...
} anonymous;


Зачем и для каких целей применяются неименованные классы?
    


Ответы

Ответ 1



Для начала хочу обратить ваше внимание, что в C++ нет анонимных классов с ключевыми словами class или struct. Вы путаете понятия безымянного класса и анонимного класса. Эти понятия различны и имеют разный семантический смысл. В своем вопросе вы ведете речь именно про безымянные классы. Определения именованных классов определяют именованные типы. Используя это имя вы явно можете объявлять члены такого класса, в объявлении которых присутствует спецификатор типа класса, объекты этого типа или, например, параметры функций. Кроме того, если имя имеет внешнее связывание, то оно будет означать одну и ту же сущность в разных единицах компиляции, если включить объявление этого имени в эти единицы компиляции. В безымянном классе невозможно, например, объявить конструкторы, деструктор, операторы, которые имеют тип возвращаемого значения или типы параметров, включающие в себя имя класса. Вы также, например, не можете объявлять члены данных класса, которые являются указателями или ссылками на объекты класса. В безымянном классе не разрешается объявлять статические члены данных класса. Из стандарта C++ (9.4.2 Static data members) 4 [ Note: There shall be exactly one definition of a static data member that is odr-used (3.2) in a program; no diagnostic is required. —end note ] Unnamed classes and classes contained directly or indirectly within unnamed classes shall not contain static data members. Например, как объявить узел списка, если вы не можете в определении этого узла объявить член данных, являющийся указателем на следующий или предыдущий узел? Так что возможности безымянных классов очень ограничены. Безымянные классы обычно используются как вложенные классы других классов или как локальные классы, когда введенный таким образом безымянный тип класса не требуется за пределами той области видимости, где этот безымянный класс определен.

Ответ 2



Эта возможность оставлена ради совместимости со старым (C без плюсов кодом). В C безымянные и именованные структуры почти равноценны, поэтому в большом объеме кода применяется: tyedef struct { int a; int b; } my_type; (чтобы можно было писать my_type вместо struct my_type в точке использования типа. В C++ безымянные классы не имеют практического применения.

Комментариев нет:

Отправить комментарий