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

Тема в разделе "LANGS.C", создана пользователем Magnum, 12 июл 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Читаю книжку по классам

    И пока особых различий между стандартным классом и структурой не вижу

    Объясните в 2х словах, какие преимущества даёт классовый и мет. подход против стандартного структурно-процедурного? ))
     
  2. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    Писать, используя классы, проще и быстрее, чем в структурно-процедурном стиле.
    Однако использование последнего заведомо приводит к созданию более производительных и компактных программ.
    Потому если Вы не эстет, объем кода и небольшие накладные расходы (malloc(1), например) Вас не смущают (или Вы, наоборот - хотите запутать код и затруднить отладку) - Ваш выбор ООП. В противном случае - функциональное программирование.
    ИМХО.
     
  3. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    А какую книжку читаете, если не секрет? )
    Как общие впечатления от стиля изложения и тп?
     
  4. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    М.б. путаница в том что в С++ структура и класс - одно и тоже, не считая области видимости элементов по умолчанию?
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    С++ за 21 день Автор: Джесс Либерти

    В целом, книжка понравилась
    Удобно, кратко, есть удобочитаемый код на прилагаемом диске.
     
  6. _DEN_

    _DEN_ DEN

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

    Бугагагага))))
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    _DEN_
    ))))))) что так развеселило? )))
     
  8. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Прежде всего - это абстракция. Как раз главная проблема с пониманием заключается в том, что ты сравниваешь низкоуровневый подход, а на низком уровне любой класс - это структура, все методы превращаются в процедуры, вызываются обычным call'ом. В отладчике, в общем случае, ты не увидешь отличий и не должен.

    Класс - это абстрактный тип данных. Любая сущность в мире может быть представлена с помощью класса или набора классов. Вся прелесть в ОО-подходе заключается в том, что программируя с использованием объектов ты пишешь код в терминах, которые описывают этот объект. Простейший пример:
    Есть у тебя две матрицы, значения которых надо прочитать из файлов определённого формата, предварительно выделив память. Далее сложить эти две матрицы и получить третью, вернуть её, а после освободить память.
    У тебя есть класс Matrix. В случае ОО-подхода для этого всего ты пишешь следующий код:

    Код (Text):
    1. Matrix foo()
    2. {
    3.   Matrix A("dat_file1.txt"), B("dat_file2.txt");
    4.  
    5.   Matrix C = A + B;
    6.   return C; // надо заметить, что возвращение больших объектов по значению не очень оптимально
    7. }
    Скажи, где я тут заморачивался с чтением файла, выделением памяти, процедурами заполнения матриц, операциями сложения и освобождением памяти? Всё это скрыто внутри класса Matrix, я же работаю с матрицами так, как я привык, ничего другого мне знать не надо, я абстрагируюсь от лишних деталей, сосредатачиваясь на объектах, с которыми работаю.

    Теперь попробуй нечто подобное реализовать без ООП. Так или иначе ты опустишься до деталей реализации, которые к матрицам отношения не имеют(допустим процедура чтения матрицы из файла, процедура заполнения матрицы, процедура сложения), но детали реализации которых тебе надо хранить в голове на всём протяжении работы с данными.
     
  9. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    [Окей. Я ошибался. Потёрто.]
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    iZzz32
    это и есть процедурный подход. неужели это надо пояснять?

    в этом коде пользователю этого кода (программисту) нужно знать, что есть реализованные сторонние ф-ции Matrix_Create_From_File, Matrix_Add, нужно знать их прототипы, а это уже тянет за собою изучение самих сорцов.
    в случае же выше, который расписал W4FhLF, для данного примера нам знать нужно примерно то же самое (параметры конструктора/ов класса Matrix, и о том, что класс Matrix имеет перегруженный бинарный оператор +, использование которого явл. очевидным).

    ИМХО, пример с классом для пользователя этого кода (программиста, который будет использовать этот класс для своих нужд) выигрывает хотя бы за счет того, что имеет более прозрачную логическую структурированность, организацию кода. мы знаем, что есть класс Matrix, и с ним можно делать то-то и то-то. это можно узнать либо по хидеру, либо по сгенеренной документации. всё.

    к примеру, в случае с классом, мы можем предположить, что раз для него есть перегруженный бинарный оператор +, то логично предположить, что есть и оператор -.
    т.е. мы можем сразу писать код: c = a+b; и если класс писал вменяемый программист, этот код будет работать.
    в случае же процедурного подхода, мы не знаем как называется процедура для вычитания матриц: Matrix_Sub, Matrix_sub, Matrix_Subtraction, Matrix_Subtract, etc etc. и мы в бОльшей вероятности чем в случае с классом полезем в документацию/сорец узнавать прототип этой ф-ции.

    все выше ИМХО.
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    n0hack
    программирование на Си - это процедурное программирование, но никак не функциональное. это разные вещи.
    wiki
     
  12. _DEN_

    _DEN_ DEN

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

    Книгами а-ля "С++ за 21 день" хорошо разжигать костер или камин. Еще удобно под ножку шкафа подкладывать чтобы не шатался)))
     
  13. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    varnie, +1

    iZzz32

    А где у тебя освобождение памяти? :)

    Хорошо, пусть твой пример не слишком перегружен. Теперь представь, что мне надо сравнить матрицу С с матрицей D(она передаётся параметром в функцию) и если они равны умножить матрицу С на единичную матрицу таким же размером, как и С.

    Я пишу:

    Код (Text):
    1. Matrix foo(const Matrix& D)
    2. {
    3.   Matrix A("dat_file1.txt"), B("dat_file2.txt");
    4.  
    5.   Matrix C = A + B;
    6.  
    7.   if(C == D)
    8.     C *= Matrix(C.get_size(), 1);
    9.  
    10.   return C;
    11. }
    Во что у тебя выльется этот код? Я всего-лишь добавил 2 новые операции. А если я их добавлю 10? А если у нас будет фигурировать не только матрицы, а ещё и векторы, кватернионы, просто скаляры разных типов(целый, с плавающей точкой)? С т.з. ООП это всё абстрактные типы данных и ты можешь работать с ними привычным тебе способом.

    И это то, что нам дают обычные классы и перегрузка операторов, а помимо этого в С++ ещё масса механизмов. Фактически, здесь мы говорим только об инкапсуляции и средствах, которыми она достигается.