вторник, 14 июня 2011 г.

struct vs class

Какое ключевое слово вы используете для классов? Или лучше так: В каких ситуациях вы используете struct, а в каких class?
Если вы случайно попали в этот блог, и не знаете чем отличаются эти ключевые слова, то подскажу - ничем, кроме моидификатора доступа/наследования по-умолчанию.

Раньше я всегда для "вумных" объектов писал class, а для всяких мелких "контейнеров" struct.
Потом лень меня победила и я стал использовать struct везде. И вот мои аргументы:

1 Наследование
Вы часто используете приватное наследование? А защищенное?
Нет? А чо так?
Я тут прикинул, что не использовал приватное наследование осмысленно ниразу. Соответственно почему оно является наследованием по-умолчанию для меня загадка. Отсюда первый довод в пользу struct: Используя ключевое слово struct вам не придется лишний раз писать "public" при наследовании.









2 Публичный интерфейс
Что вы ожидаете увидеть, открывая хедер какого-либо класса? Я, обычно, хочу увидить его публичный интерфейс, дабы понять что этот класс делает. И, мне, не менее обычно, наплевать КАК он это делает. Посему, я хочу увидеть это как можно быстрее, без вского там скроллинга. В общем, я за то, чтобы публичная часть класса была "сверху". Так в принципе многие и делают. И выглядит это как-то так:











Вы не находите, что здесь что-то лишнее?

Итог
А в итоге часто имеем такой код:

В приведенном листинге 3 раза написано ключевое слово public. И все три раза оно нафиг не нужно при использовании struct.









P.S. Не то чтобы я считал это все очень важной проблемой C++. Просто захотелось что-нибудь запостить в блог =) Не принимайте близко к сердцу

16 комментариев:

  1. 1. теряем отличие структур и классов.

    2. #define p public или типа того тоже уменьшит количество писанины, но важнее ли это читаемости?

    ОтветитьУдалить
  2. #define p public это, конечно, просто великолепно.
    Вот еще пример кода в том же стиле, который "уменьшает количество писанины":

    typedef pair< double, double> Point;
    #define x first
    #define y second

    ОтветитьУдалить
  3. Первому анониму:
    1. Не совсем понял, в чем потеря. Да и вам что, жалко?))
    2. Читаемость не уменьшется ни на йоту. Зато лишние слова пропадают.

    А за код с дефайнами стерилизовал бы...

    ОтветитьУдалить
  4. 1. одно слово означает разные вещи.
    bool на char ведь тоже можно заменить, но не меняют же.

    2. где критерий "лишнести" слова? есть язык с 6 операторами, который все знают). Можно сказать, что он получился выпиливанием из того же С++ всего "лишнего".

    ОтветитьУдалить
  5. 1 Замена bool на char не безопасна. Так как это разные типы. И разные они, в том числе, с точки зрения компилятора. В то же время - struct и class - совершенно одна хрень. Замена одного на другое никогда не вызовет ошибки(ну если опустить нюансы с доступом). А вот замена bool<->char может. Например при использовании специализации вектора.
    2 "Лишнесть" в том, что тот же код, можно переписать без этого слова без потерь. Вообще без потерь. Хотя нет. Есть потеря. Строка кода исчезла в примере...

    ОтветитьУдалить
  6. struct и class, как инь и янь, они прямо противоположны, но при этом едины в своей сущности.
    struct олицетворяет положительные качества: открытость, общительность, жизнерадосность, а class - отрицательные: скрытость, скупость, лицемерность.
    Но в программе, как и в жизни, нельзя обходится только одной стороной, везде нужно соблюдать баланс, тогда программа будет находится в душевном равновесии, а значит не прибудет в ней багов.

    ОтветитьУдалить
  7. В плюсах вообще многое можно делать разными способами.
    if (!b)
    if (b == false)
    if (b != true)

    За это его и любят. Почему тебе не нравится конкретно это проявление?

    ОтветитьУдалить
  8. Оно мне очень нравится потому, что о нем мало кто задумывается.
    Вот в приведенном примере у переменной b есть два состояния true и false. И при взгляде на код без контекста они равновероятны. А в случае с, например, наследованием распределение вероятностей примерно такое:
    0% за приватное наследование
    0% за защищенное
    100% за открытое

    Ну и вообще, я ленивый.

    ОтветитьУдалить
  9. У struct и class есть еще некоторые отличия. Например struct нельзя использовать в качестве темплейтного параметра.

    ОтветитьУдалить
  10. Вот, пожалуйста.
    Надо учить матчасть или лучше формулировать мысль

    template< typename T>
    struct MyList
    {
    private:
    T* data_;
    };

    template < template< typename T1> class A>
    struct B
    {
    A< int> a;
    };

    int main()
    {
    B< MyList> b;
    }

    ОтветитьУдалить
  11. Я думаю, имелось ввиду все же
    template < struct T >...

    Что, впрочем, не является существенным. ИМХО. Так как речь все же шла о применении struct и class при создании классов.

    ОтветитьУдалить
  12. Добрый день, AXL,
    извиняюсь что пишу не в тему, ну другого способа связи не нашёл, решил в самый последний пост написать, чтобы увеличить вероятность прочтения этого сообщения)

    Наткнулся на твой блог , когда гуглил информацию по Спб АУ, очень полезная информация оказалась для меня и сформировывала конкретный образ об этом образовательном учереждение, за что Тебе признателен. Я сам оказазался подобной ситуации только в новосибирском вузе , вот доучился до конца 3 курса и и всё больше склоняюсь к тому, что надо менять ВУЗ , т.к надоело чувствовать всеобщее безразличее как со стороны преподователей, так и учащихся.
    Твой блог укрепил мои намерения) в пользу АУ.
    Хотел у тебя узнать про собеседованию, а конкретно про математику , у меня в вузе особо не требовали да и к концу 3 курса матан, мат. логика, дискретная мат. выветрились из моей головы. Поэтому обращаюсь к тебе за советом или ответом на следующие вопросы:
    Требуется ли на собеседование знать всю примерную программу матана по техническим специальностям ( формулировки теорем с докозательствами) ну и по другим математическим предметам? или же необходимы базовые знания(производная, дифференциал...)? и нужно ли решать какие то сложные задачи по математике?

    Читал твой ответ на такой же вопрос в начале блога , там Ты говорил только про программирование. хочу вот понять стоит ли подтягивать математику и до какого уровня, так как время ещё есть.
    Буду благодарен за любую информацию.
    С уважением, просто студент

    ОтветитьУдалить
  13. Привет.
    Я не знаю, что там сейчас спрашивают на собеседованиях. Но в прошлом году спрашивали довольно базовые вещи. Например:
    Сколько ребер в полном графе? Определение предела. Что такое гамильтонов и эйлеров цикл? И им подобные.
    Сложных задач по математике не давали. По крайней мере на SE.

    Но вообще, как обычно - могут спросить что угодно.
    В общем, удачи на собеседовании)

    ОтветитьУдалить
  14. Спасибо большое), буду готовится

    ОтветитьУдалить