в некоторых статьях об ООП наталкивался на утверждение, что при использовании классов создается много всего лишнего и для уменьшения размера кода и размера используемой памяти лучше использовать структуры... я канеш понимаю, что конкретная реализация зависит от компилятора, но вопрос вот в чем: есть ли разница между реализациями следующих пунктов для классов и структур: 1) конструкторы/деструкторы 2) перегрузка операторов 3) наследование как реализованы vtable? как-то можно выиграть при реализации собственного интерфейса в виде структуры указателей на соответствующие функции (как ООП в С)?
Разницы нет. Снова нет. Вся известная мне разница между структурами и классами заключается в дефолтовой области видимости мемберов и POD.
можно подробнее про POD... вообще я думал, что наличие виртуальной функции, или оператора присваивания, или private/protected членов уже делает структуру не-POD типом...
Rel Так и есть. Но class по определению не pod, а структура может этим быть. Вообще pod это классическая Си структура, шаг в сторону и расстрел.
спасибо! еще один вопрос про перегрузку оператора присваивания... есть класс: Код (Text): class NewClass { public: ... virtual NewClass& operator = (int value); virtual operator int(); ... private: int a; }; ... NewClass& NewClass::operator =(int value) { this->a = value; return *this; } NewClass::operator int() { return this->a; } почему то не работает так: Код (Text): ... NewClass Var(); Var = (int)100; int a = Var; ... но работает так: Код (Text): ... NewClass* pVar = new NewClass(); *pVar = (int)100; int a = *pVar; ... что я сделал не так? ведь по идее должно работать как в первой так и во второй записи...
блин... вот я протупил... спасибо! ну насколько я понял из интернет-источников, класс может быть pod, если в нем отсутствуют определенные факторы... но это не гарантированное стандартом поведение, то есть при использовании одного компилятора может быть, при использовании другого - нет... если это есть в стандарте - то поправьте меня... и кстати кто знает, где хранится указатель this? если среди данных класса, то точно не pod-тип))) кстати.. вот я понимаю, почему наличие виртуальных функций делает объект не pod-типом (так как среди данных появляется указатель на таблицу виртуальных функций), про public/private тоже понятно (компилятор может группировать данные с одинаковыми правами доступа, меняя тем самым порядок следования в памяти), но мне не понятно насчет перегруженных операторов, каким образом могут меняться данные в этом случае?
а наличие перегруженых операторов никак не повлияет на подовость (если они не виртуальные), влияет отсутствие нетривиальных дефолтного конструктора и конструктора копирования указатель this нигде не хранится, а неявно передаётся в нестатические методы
Код (Text): #include <boost/type_traits/is_pod.hpp> class A { public: int i; }; BOOST_STATIC_ASSERT(boost::is_pod<A>::value); компилится =)
вот из драфта 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): struct N { // neither trivial nor standard-layout int i; int j; virtual ~N(); }; struct T { // trivial but not standard-layout int i; private: int j; }; struct SL { // standard-layout but not trivial int i; int j; ~SL(); }; struct POD { // both trivial and standard-layout int i; int j; }; —end example ]