Читаю книжку по классам И пока особых различий между стандартным классом и структурой не вижу Объясните в 2х словах, какие преимущества даёт классовый и мет. подход против стандартного структурно-процедурного? ))
Писать, используя классы, проще и быстрее, чем в структурно-процедурном стиле. Однако использование последнего заведомо приводит к созданию более производительных и компактных программ. Потому если Вы не эстет, объем кода и небольшие накладные расходы (malloc(1), например) Вас не смущают (или Вы, наоборот - хотите запутать код и затруднить отладку) - Ваш выбор ООП. В противном случае - функциональное программирование. ИМХО.
М.б. путаница в том что в С++ структура и класс - одно и тоже, не считая области видимости элементов по умолчанию?
С++ за 21 день Автор: Джесс Либерти В целом, книжка понравилась Удобно, кратко, есть удобочитаемый код на прилагаемом диске.
Прежде всего - это абстракция. Как раз главная проблема с пониманием заключается в том, что ты сравниваешь низкоуровневый подход, а на низком уровне любой класс - это структура, все методы превращаются в процедуры, вызываются обычным call'ом. В отладчике, в общем случае, ты не увидешь отличий и не должен. Класс - это абстрактный тип данных. Любая сущность в мире может быть представлена с помощью класса или набора классов. Вся прелесть в ОО-подходе заключается в том, что программируя с использованием объектов ты пишешь код в терминах, которые описывают этот объект. Простейший пример: Есть у тебя две матрицы, значения которых надо прочитать из файлов определённого формата, предварительно выделив память. Далее сложить эти две матрицы и получить третью, вернуть её, а после освободить память. У тебя есть класс Matrix. В случае ОО-подхода для этого всего ты пишешь следующий код: Код (Text): Matrix foo() { Matrix A("dat_file1.txt"), B("dat_file2.txt"); Matrix C = A + B; return C; // надо заметить, что возвращение больших объектов по значению не очень оптимально } Скажи, где я тут заморачивался с чтением файла, выделением памяти, процедурами заполнения матриц, операциями сложения и освобождением памяти? Всё это скрыто внутри класса Matrix, я же работаю с матрицами так, как я привык, ничего другого мне знать не надо, я абстрагируюсь от лишних деталей, сосредатачиваясь на объектах, с которыми работаю. Теперь попробуй нечто подобное реализовать без ООП. Так или иначе ты опустишься до деталей реализации, которые к матрицам отношения не имеют(допустим процедура чтения матрицы из файла, процедура заполнения матрицы, процедура сложения), но детали реализации которых тебе надо хранить в голове на всём протяжении работы с данными.
iZzz32 это и есть процедурный подход. неужели это надо пояснять? в этом коде пользователю этого кода (программисту) нужно знать, что есть реализованные сторонние ф-ции Matrix_Create_From_File, Matrix_Add, нужно знать их прототипы, а это уже тянет за собою изучение самих сорцов. в случае же выше, который расписал W4FhLF, для данного примера нам знать нужно примерно то же самое (параметры конструктора/ов класса Matrix, и о том, что класс Matrix имеет перегруженный бинарный оператор +, использование которого явл. очевидным). ИМХО, пример с классом для пользователя этого кода (программиста, который будет использовать этот класс для своих нужд) выигрывает хотя бы за счет того, что имеет более прозрачную логическую структурированность, организацию кода. мы знаем, что есть класс Matrix, и с ним можно делать то-то и то-то. это можно узнать либо по хидеру, либо по сгенеренной документации. всё. к примеру, в случае с классом, мы можем предположить, что раз для него есть перегруженный бинарный оператор +, то логично предположить, что есть и оператор -. т.е. мы можем сразу писать код: c = a+b; и если класс писал вменяемый программист, этот код будет работать. в случае же процедурного подхода, мы не знаем как называется процедура для вычитания матриц: Matrix_Sub, Matrix_sub, Matrix_Subtraction, Matrix_Subtract, etc etc. и мы в бОльшей вероятности чем в случае с классом полезем в документацию/сорец узнавать прототип этой ф-ции. все выше ИМХО.
n0hack программирование на Си - это процедурное программирование, но никак не функциональное. это разные вещи. wiki
Magnum Книгами а-ля "С++ за 21 день" хорошо разжигать костер или камин. Еще удобно под ножку шкафа подкладывать чтобы не шатался)))
varnie, +1 iZzz32 А где у тебя освобождение памяти? Хорошо, пусть твой пример не слишком перегружен. Теперь представь, что мне надо сравнить матрицу С с матрицей D(она передаётся параметром в функцию) и если они равны умножить матрицу С на единичную матрицу таким же размером, как и С. Я пишу: Код (Text): Matrix foo(const Matrix& D) { Matrix A("dat_file1.txt"), B("dat_file2.txt"); Matrix C = A + B; if(C == D) C *= Matrix(C.get_size(), 1); return C; } Во что у тебя выльется этот код? Я всего-лишь добавил 2 новые операции. А если я их добавлю 10? А если у нас будет фигурировать не только матрицы, а ещё и векторы, кватернионы, просто скаляры разных типов(целый, с плавающей точкой)? С т.з. ООП это всё абстрактные типы данных и ты можешь работать с ними привычным тебе способом. И это то, что нам дают обычные классы и перегрузка операторов, а помимо этого в С++ ещё масса механизмов. Фактически, здесь мы говорим только об инкапсуляции и средствах, которыми она достигается.