Страницы

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

четверг, 19 декабря 2019 г.

Классы против структур

#структуры #code_style #cpp


Стоит ли в своих кодах C++ использовать структуры? Я так понимаю структуры это пережитки
языка С. С одной стороны структуры в написании и использования проще классов но они
подрывают принципы ООП.
    


Ответы

Ответ 1



В Си++ основная разница между структурой и классом - это модификатор доступа, который используется по умолчанию для их членов. Для классов, по умолчанию используется модификатор private, а для структур - public. Конечно, принципы инкапсуляции структуры таким образом подрывают, но классы, в свою очередь тормозят стадию проектирования, которая затрагивает структурную эволюцию проекта. Т.е., к примеру: выделить класс из структуры проще, чем из класса, т.к. для класса придется пересматривать логику взаимодействия свойств, которые ранее были на одном уровне доступа. Этот процеесс выливается в дописывание/переписывание методов, обеспечивающих инкапсуляцию. Все было бы хорошо, если бы на какой-то очередной стадии проектирования Вы вдруг не осознаете, что порой ходите кругами, делая пустую работу, прикрывая тылы инкапсуляции. С одной стороны, можно конечно занять позицию рецензора Си++ и следовать "букве закона ООП", т.е. смириться с этой неизбежной бюрократией. Но с другой стороны - это ведь Ваш проект, и Вы вправе строить его по своим законам, давая волю свободному проектированию какого-то сложного класса на структурах, а его финальные версии закрепить на классах по всем правилам ООП.

Ответ 2



Стоит ли в своих кодах C++ использовать структуры? По мере надобности да. Я так понимаю структуры это пережитки языка С. нет. С одной стороны структуры в написании и использования проще классов и чем же они проще? struct длиннее class:) вот код для медитации: #include using namespace std; struct test { test() { // у структур есть конструктор q = 1; cout << "ctor" << endl; } ~test() { // и деструктор! cout << "dtor" << endl; } int get_q() {return q;} private: // и даже приватная часть int q; }; class mega:public test { // и от них можно наследоваться. }; int main() { test t; cout << t.get_q() << endl; mega m; return 0; } но они подрывают принципы ООП. нет. Просто по умолчанию в классах все приватное, а в структурах - публичное. Но это просто соглашение. Есть ещё пару мелочей.

Ответ 3



При правильном использовании структуры не нарушают принципов ООП. Применять их следует для логического объединения данных, когда нет смысла, да и логического основания для создания объектов. Например у нас есть картинка. Для сохраниения данных о ее размерах нам нет смысла создавать класс. В этом случае гораздо лучше и удобнее использовать структуру, которая, являясь членом класса "картинка", объединит в себе поля "высота" и "ширина". Чаще всего эти данные будут требоваться нам вместе, поэтому и получать их у картинки будет логичнее вместе.

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

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