ООП для самых маленьких
|
|
eXceed | Дата: Четверг, 08.05.2008, 02:51 | Сообщение # 1 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Данный раздел создан для того, чтоб научить читателя основам ООП. Для компиляции примеров подойдет Microsoft Visual Studio 2005 Express(сам я использую Team Suite) Проект по умолчанию: Создаете новый проект Win32 Console Application. Далее выбираете опцию: Пустой проект. После создания проекта добавьте в проект новый C++ файл main.cpp(зависит от настроек IDE). Надюсь разберетесь сами =) Тут ничего сложного нет. 1. Введение в классы С++ Механизм классов в C++ позволяет пользователям определять собственные типы данных. По этой причине их часто называют пользовательскими типами. Класс может наделять дополнительной функциональностью уже существующий тип. Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений: Пример: ... class MyClass { public: MyClass(void); virtual ~MyClass(void); }; Здесь объявлен класс MyClass с методом доступа public, конструктором MyClass, деструктором ~MyClass объявленным как вирутальный. Об этом позже. Каждый класс начинается с этих строк Каждое определение вводит новый тип данных. Даже если два класса имеют одинаковые списки членов, они все равно считаются разными типами: Пример: class First { int memi; double memd; }; class Second { int memi; double memd; }; Тело класса определяет отдельную область видимости. Объявление членов внутри тела помещает их имена в область видимости класса. Наличие в двух разных классах членов с одинаковыми именами – не ошибка, эти имена относятся к разным объектам. Подробнее об областях видимости классов мы поговорим позже. После того как тип класса определен, на него можно ссылаться двумя способами: 1. Написать ключевое слово class, а после него – имя класса. 2. Указать только имя класса. Данные-члены класса объявляются так же, как переменные. Например, у класса MyClass могут быть следующие данные-члены: int iDec; string sSomeString; Член класса может иметь любой тип: int topStack; void (*handler)(); vector stack; Описанные данные-члены называются нестатическими. Класс может иметь также и статические данные-члены. Об этом позже. Объявления данных-членов очень похожи на объявления переменных в области видимости блока или пространства имен. Однако их, за исключением статических членов, нельзя явно инициализировать в теле класса: class First { int memi = 0; // ошибка double memd = 0.0; // ошибка }; Пример использования членов класса вы сможете найти в архиве. Завтра мы поговорим о конструкторах и деструкторах.
Прикрепления:
Ex1.7z
(424.8 Kb)
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
eXceed | Дата: Четверг, 08.05.2008, 12:49 | Сообщение # 2 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Конструкторы и Деструкторы классов Если вы писали длинные программы, то знаете, что в некоторых частях программы обычно требуется инициализация. Необходимость инициализации часто еще сильней проявляется при работе с объектами. Для решение этой проблемы в языке C++ присутствуют конструкторы(constructor functions) включаемые в описание класса. Конструкторы класса выполняется каждый раз при создании объекта этого класса. Таким образом инициализация выполняется автоматически. Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения. Пример: #include <iostream> using namespace std; class myclass { int a; public: myclass(); //Конструктор void show; }; myclass::myclass() { cout << "Это конструктор\n"; a = 10; } void myclass::show() { cout << a; } int main() { myclass ob; ob.show(); return 0; } В этом простом примере значение a инициализируется конструктором myclass(). Конструктор выполняется тогда, когда создается объект ob. Функцией, обратной конструктору объекта, является деструктор (destructor). Эта функция вызывается при удалении объекта. Обычно при работе с объектом в момент его удаления должны выполняется некоторые действия. Например, при создании объекта для него выделяется память, которую необходимо освободить при его удалении. Имя деструктора совпадает с именем класса, но с символом ~(тильда) в начале. Пример класса с деструктором: #include <iostream> using namespace std; class myclass { int a; public: myclass(); //Конструктор ~myclass(); //Деструктор void show(); }; myclass::myclass() { cout << "Constructor\n"; a = 10; } myclass::~myclass() { cout << "Deleting...\n"; //Desstructor } void myclass::show() { cout << a << "\n"; } int main() { myclass ob; ob.show(); return 0; } Деструктор класса вызывается при удалении объекта. Локальные объекты удаляются тогда, когда выходят из области видимости. Глобальные объекты удаляются при завершении работы программы. Адреса конструктора и деструктора получить невозможно. Замечание. Никогда не инициализируйте в конструкторе больше объемы данных! Пример тут.
Прикрепления:
Ex2.7z
(413.3 Kb)
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
eXceed | Дата: Суббота, 10.05.2008, 14:35 | Сообщение # 3 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Небольшое дополнение к предыдущему сообщению. Конструкторы с параметрами бывают. Для этого необходимо просто добавить аргументы к конструктору. Как в обычной функции вообщем =) Введение в наследование классов В C++ наследование - это механизм, посредством которого один класс может наследовать свойства дргого. НАследование позволяет строить иерархию классов, переходя от общих классов к более специальным. Для начала нужно определить два термина, обычно используемые при обсуждении наследования. Когда один класс наследуется другим, класс который наследуется, называют базовым классом (base class). Наследующий класс называют производным классом (derived class). Обычно процесс наследования начинается с задания базового класса. Базовый класс класс определяет все те качества, которые будут общими для всех производных от него классов. Пример: // Определение базового класса class B { int i; public: void set_i(int i); int get_i(); }; Теперь объявим производный класс, наследующий базовый класс: class D: public B { int j; public void set_j(int n); int mul(); }; Внимательно прочтите это еще раз. Обратите внимание, что в имени класса D имеется двоеточие, за которым слудет ключевое слово public и имя класса B. Для компилятора это указание на то, что класс D будет наследовать все компоненты класса B в разделе public(тоесть открытого для всех). И эти компоненты останутся открыты для всех и в производном классе! Однако все закрытые (private) элементы останутся закрытыми. Основная форма наследования базового класса: class имя_производного_класса: список_доступа имя_базового_класса { ... ... ... }; Пример реализации:
Прикрепления:
Ex3.7z
(423.0 Kb)
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
Anteme | Дата: Суббота, 24.05.2008, 12:03 | Сообщение # 4 |
Лейтенант
Группа: Проверенные
Сообщений: 65
Статус: Offline
| к чему столька букав, когда инфы в интернете навалом и можно просто дать ссылку на нее
и всю оставшуюся жизнь он видел летящий в него кирпич..
|
|
| |
Expert | Дата: Суббота, 24.05.2008, 12:19 | Сообщение # 5 |
Главный
Группа: Администраторы
Сообщений: 6114
Статус: Offline
| Quote (Anteme) к чему столька букав, когда инфы в интернете навалом и можно просто дать ссылку на нее eXceed популяризирует ООП и начал он это делать великолепно. Думаю, не стоит мешать. Я совершенно точно знаю, что уже некоторым форумчанам эта информация очень помогла начать понимать ООП. Насчет ссылок - согласен, их уйма. Но ведь в этом информационном хаосе еще надо уметь ориентироваться... Продолжайте, eXceed, прошу вас. Продолжайте.
Блог декана
Уведомление для прессы и всех пользователей сети интернет: администрация форума может не заметить вовремя нецензурных слов и других, возможно, оскорбительных выражений/картинок/прочих материалов. Если вы заметили косвенный либо прямой факт оскорбления кого бы то ни было, пожалуйста, сообщите об этом администратору форума для принятия решения об удалении/модерировании соответствующего сообщения. Полный текст уведомления см. здесь.
|
|
| |
vitalyu | Дата: Суббота, 24.05.2008, 16:44 | Сообщение # 6 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Согласен! Это полезно всем, без исключения, и даже автору, eXceed'у!!! У нас с ним уже есть опыт преподавания, сам присутствовал как-то на паре у Паши, и считаю его одним из лучших преподавателей Эти статьи прекрасно помогут в изучении азов ООП, не теряя времени на "воду", коей любят разбавлять информацию авторы иных статей и тем более книг. Здесь все пишется для нас, персонально для нас! И цель - не получить выгоду, а желание научить! Спасибо, уважуха!
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
Сообщение отредактировал vitalyu - Суббота, 24.05.2008, 16:44 |
|
| |
eXceed | Дата: Суббота, 24.05.2008, 17:02 | Сообщение # 7 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Anteme Я стараюсь излагать эти вещи доступным для читателя языком. Ориентируясь на то, что в этой теме читатель вообще не знаком с ООП. Конечно сейчас у меня мало времени стало(сессия =\ ), поэтому я редко пишу статьи теперь. з.ы. имхо статьи написанные простым языком для людей которые особо не разбираются в кодинге и абсолютно не разбирающихся в ООП + простые и наглядные примеры == лучше для читателя, т.к. разобраться проще во всем. Указатели на объекты До сих пор мы осуществляли доступ к членам объекта с помощью оператора точка(.). Это верно при работе с объектом. Однако доступ к членам объекта можно получить также и через указатель на этот объект. В этом случае обычно применяется оператор стрелка(->). Аналогичным способом, оператор стрелка (->) используется при работе с указателями на структуру. Мы объявляем указатель на объект точно так же, как и указатель на переменную любого типа. Задаем имя класса этого объекта, а затем имя переменной со звездочкой перед ним. Для получения адреса объекта перед ним необходим оператор &, точно так же, как это делается для получения адреса переменной другого типа. Как и для любого другого указателя, если инкрементировать указатель на объект, он будет указывать на следующий объект такого же типа. Следует обратить внимание myclass *p; Создает указатель на объект класса myclass. Это важно для понимания следующего положения: создание указателя на объект не создает объект, оно только создает указатель на него. Для передачи адреса объекта ob в перменнную p, используется конструкция p = &ob; Остальное вы увидите в примере.
Прикрепления:
Ex4.7z
(408.4 Kb)
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
Anteme | Дата: Суббота, 24.05.2008, 20:25 | Сообщение # 8 |
Лейтенант
Группа: Проверенные
Сообщений: 65
Статус: Offline
| Что же вы все так Я же вовсе не против, скорее наоборот. Вполне понимаю, что изложенное это не просто откуда-то скопированное. Это выжатый материал для новичка из тонны подобной инфы Quote (Expert) Насчет ссылок - согласен, их уйма. Но ведь в этом информационном хаосе еще надо уметь ориентироваться... именно поэтому я и написала "можно просто дать ссылку на нее", имела ввиду достойную внимания информацию
и всю оставшуюся жизнь он видел летящий в него кирпич..
|
|
| |
eXceed | Дата: Суббота, 24.05.2008, 22:42 | Сообщение # 9 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Anteme Я к чему и веду. Лучше вы узнаете это от человека, который программированием зарабатывает на жизнь, чем из какой то мало понятной книжки.
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
vitalyu | Дата: Воскресенье, 25.05.2008, 04:58 | Сообщение # 10 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| Гы. Приложи ту фотку "Пишу на C++ за еду"
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
|
|
| |
eXceed | Дата: Воскресенье, 25.05.2008, 13:21 | Сообщение # 11 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| А ведь писал!
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
Anteme | Дата: Воскресенье, 25.05.2008, 17:35 | Сообщение # 12 |
Лейтенант
Группа: Проверенные
Сообщений: 65
Статус: Offline
| Quote (vitalyu) "Пишу на C++ за еду" даешь каждому сиплюсплюснику по еде!!
и всю оставшуюся жизнь он видел летящий в него кирпич..
|
|
| |
eXceed | Дата: Среда, 25.06.2008, 01:41 | Сообщение # 13 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Лениво писать сейчас про ООП. Поэтому решил написать статью по второй части названия темы. Введение в библиотеку стандартных шаблонов(STL). Библиотека STL(Standart Template Library) изначально не являлась частью исходной спецификации языка С++, а была добавлена к нему позже в процессе стандартизации. Библиотека STL обеспечивает стандартные(общецелевые) классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных. Хочу заметить, что синтаксис STL изначально выглядит пугающе, т.к. в нем используются самые изощренные свойства языка С++. Ядро библиотеки образует три основополагающих элементов: Контейнеры, Алгоритмы, Итераторы. Контейнер - это объекты, предназначенные для хранения других объектов. Контейнеры бывают различных типов. Например vector(вектор) определяющий динамический массив. Контейнер quene(очередь) определяющий очередь объектов. Контейнер list(список) определяющий список объектов. Дополнительно существуют ассоциативные контейнеры, позволяющие быстро получать значения при помощи ключей(keys). Каждый класс - контейнер определяет набор функций для работы с этим контейнером. Например, список содержит функции вставки, удаления и слияния(merge) элементов. Алгоритмы выполняют операции над содержимым контейнеров. Существуют алгоритмы сортировки, инициализации и етц. Многие алгоритмы предназначены для работы с последовательностями, которая представляет собой линейный список элементов внутри контейнера. Итераторы - это объекты, которые по отношению к контейнерам играют роль указателей. Они позволяют получить доступ к содержимому контейнера. Итераторы бывают: произвольного доступа, двунаправленные, однонаправленные, ввода, вывода. Начнем с изучения вектора(vector). Вероятно vector самый популярный контейнер библиотеки STL. По сути он собой представляет динамический массив. Спецификация шаблона vector: Code template<class T, class Allocator = allocator<T>>class vector Где T - тип предназначенных для хранения данных. Allocator задет распределитель памяти, который по умолчанию является стандартным распределителем. Хотя синтаксис шаблона выглядит сложным, то на практике все гораздо проще. Code vector<int> iv; //Создает вектор нулевой длинны для целых чисел vector<char> cv(5); //Создает вектор из пяти элементов для символов vector<char> cv(5, 'x'); //Создание и инициализация вектора из пяти элементов vector<int> iv2(iv); //Создание вектора для целых чисел из вектора для целых чисел Для класса вектор определены следующие операторы сравнения: ==, <, <=, !=, >, >= Дополнительно определяется оператор индекса [], что обеспечивает произвольный доступ к членам вектора. Список функций класса vector очень велик и поэтому вам следует обратиться к документации в msdn. Я лишь перечислю самые основные функции. Наиболее важные функции: size(), begin(), end(), push_back(), insert(), erase(). Почти все функции возвращают в качестве значение итераторы. В примере вы увидите как эта машина STL работает. Пример ниже. Убедительно прошу читать внимательно коментари! В следующий раз я покажу как работать с итераторами.
Прикрепления:
Ex5.7z
(352.8 Kb)
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
eXceed | Дата: Четверг, 26.06.2008, 23:24 | Сообщение # 14 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать! И не имеет значения Delphi это или C++. По большей части я ведь даю универсальную базу применимую и в Delphi и в C++! Если вы делаете АРМ или АСУ - архитектурные изыски должны использоваться в полной мере. Когда я не знал этих вещей, для меня большая программа казалось непостижимо сложной! Но дальше я узнал о паттернах, архитектурах и етц. Жить стало легче и проще. Я шагнул на новый уровень. И вам дорогие студенты и преподаватели рекомендую читать, комментировать и задавать вопросы. Линейщики и ООПкуны(Дельфины использующие ООП вслепую. Привет VCL) не подозревают, что теряют...
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
vitalyu | Дата: Пятница, 27.06.2008, 02:26 | Сообщение # 15 |
Генерал-полковник
Группа: Гости
Сообщений: 852
Статус: Offline
| На самом деле, я вот все жду, когда ты свою книгу выпустишь Читать реально интересно Я хоть и не отписываю, но читаю постоянно Возможно, и др. также .. ООП - мощь, и никакое не будущее, а настоящее .. Поэтому не знать сие (и не хотеть знать) - позор программисту
Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией. ... Автомат Калашникова - это средство для превращения стэка в очередь...
|
|
| |