Разница между структурами и классами в ООП С++

Тема в разделе "LANGS.C", создана пользователем Rel, 1 фев 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    в некоторых статьях об ООП наталкивался на утверждение, что при использовании классов создается много всего лишнего и для уменьшения размера кода и размера используемой памяти лучше использовать структуры... я канеш понимаю, что конкретная реализация зависит от компилятора, но вопрос вот в чем: есть ли разница между реализациями следующих пунктов для классов и структур:
    1) конструкторы/деструкторы
    2) перегрузка операторов
    3) наследование

    как реализованы vtable? как-то можно выиграть при реализации собственного интерфейса в виде структуры указателей на соответствующие функции (как ООП в С)?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Разницы нет.

    Снова нет.

    Вся известная мне разница между структурами и классами заключается в дефолтовой области видимости мемберов и POD.
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Никакой разницы нет, за исключением, что структуры по умолчанию public, а классы - private.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    можно подробнее про POD... вообще я думал, что наличие виртуальной функции, или оператора присваивания, или private/protected членов уже делает структуру не-POD типом...
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Rel
    Так и есть. Но class по определению не pod, а структура может этим быть. Вообще pod это классическая Си структура, шаг в сторону и расстрел.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    спасибо! еще один вопрос про перегрузку оператора присваивания... есть класс:
    Код (Text):
    1. class NewClass
    2. {
    3. public:
    4.   ...
    5.   virtual NewClass& operator = (int value);
    6.   virtual operator int();
    7.   ...
    8. private:
    9.   int a;
    10. };
    11. ...
    12. NewClass& NewClass::operator =(int value)
    13. { this->a = value; return *this; }
    14.  
    15. NewClass::operator int()
    16. { return this->a; }
    почему то не работает так:
    Код (Text):
    1. ...
    2. NewClass Var();
    3. Var = (int)100;
    4. int a = Var;
    5. ...
    но работает так:
    Код (Text):
    1. ...
    2. NewClass* pVar = new NewClass();
    3. *pVar = (int)100;
    4. int a = *pVar;
    5. ...
    что я сделал не так? ведь по идее должно работать как в первой так и во второй записи...
     
  7. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Rel
    здесь ошибка. это объявление функции

    нужно так:
    NewClass Var = NewClass();
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Да щаз.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    блин... вот я протупил... спасибо!

    ну насколько я понял из интернет-источников, класс может быть pod, если в нем отсутствуют определенные факторы... но это не гарантированное стандартом поведение, то есть при использовании одного компилятора может быть, при использовании другого - нет... если это есть в стандарте - то поправьте меня... и кстати кто знает, где хранится указатель this? если среди данных класса, то точно не pod-тип)))

    кстати.. вот я понимаю, почему наличие виртуальных функций делает объект не pod-типом (так как среди данных появляется указатель на таблицу виртуальных функций), про public/private тоже понятно (компилятор может группировать данные с одинаковыми правами доступа, меняя тем самым порядок следования в памяти), но мне не понятно насчет перегруженных операторов, каким образом могут меняться данные в этом случае?
     
  10. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    а наличие перегруженых операторов никак не повлияет на подовость (если они не виртуальные), влияет отсутствие нетривиальных дефолтного конструктора и конструктора копирования

    указатель this нигде не хранится, а неявно передаётся в нестатические методы
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вообще-то
    Код (Text):
    1. NewClass Var;
    лишнее копирование не нужно.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    У Вас иное мнение? Агрументируйте.
     
  13. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Код (Text):
    1. #include <boost/type_traits/is_pod.hpp>
    2.  
    3. class A
    4. {
    5. public:
    6.    
    7.     int i;
    8. };
    9. BOOST_STATIC_ASSERT(boost::is_pod<A>::value);
    компилится =)
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    а каким образом это влияет на "подовость"?)
     
  15. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    вот из драфта

    9.5 A trivial class is a class that has a trivial default constructor (12.1) and is trivially copyable.
    [ Note: in particular, a trivially copyable or trivial class does not have virtual functions or virtual base
    classes.—end note]

    9.6 A standard-layout class is a class that:
    — has no non-static data members of type non-standard-layout class (or array of such types) or reference,
    — has no virtual functions (10.3) and no virtual base classes (10.1),
    — has the same access control (Clause 11) for all non-static data members,
    — has no non-standard-layout base classes,
    — either has no non-static data members in the most-derived class and at most one base class with
    non-static data members, or has no base classes with non-static data members, and
    — has no base classes of the same type as the first non-static data member.

    9.9 A POD struct is a class that is both a trivial class and a standard-layout class, and has no non-static data
    members of type non-POD struct, non-POD union (or array of such types). Similarly, a POD union is a
    union that is both a trivial class and a standard layout class, and has no non-static data members of type
    non-POD struct, non-POD union (or array of such types). A POD class is a class that is either a POD
    struct or a POD union.
    [ Example:
    Код (Text):
    1. struct N { // neither trivial nor standard-layout
    2.  int i;
    3.  int j;
    4.  virtual ~N();
    5. };
    6.  
    7. struct T { // trivial but not standard-layout
    8.  int i;
    9. private:
    10.  int j;
    11. };
    12.  
    13. struct SL { // standard-layout but not trivial
    14.  int i;
    15.  int j;
    16.  ~SL();
    17. };
    18.  
    19. struct POD { // both trivial and standard-layout
    20.  int i;
    21.  int j;
    22. };
    —end example ]
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Выброси этого автора)
     
  17. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    GoldFinch
    это не копирование - это инициализация.