|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.02.2013, 22:47 | #1 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Основы C++ для начинающих от 8Observer8
Здравствуйте, дорогие друзья!
Решил написать памятку для тех, кто начал изучать С++ и только делает первые шаги. Объектно-ориентированное программирование (ООП) Объектно-ориентированное программирование (ООП) "стоит на трёх китах": - Классификация - Специализация - Полиморфизм Классификация - обеспечивается инкапсуляцией и сокрытием данных. Инкапсуляция - механизм языка, который позволяем создавать модели объектов (классы). Сокрытие данных (свойств) и внутренних функций (методов) - реализуется с помощью областей private и protected. Пример классификации. Как известно, живые существа классифицируются на животных, птиц, насекомых и т.д. Для примера, рассмотрим класс животных. У животных очень много свойств (данных). Возьмём свойство "количество глаз". У всех животных два глаза. Создадим переменную, которая будет хранить это значение и метод, который позволит узнать количество глаз животного. Значение переменной "количество глаз" можно узнать только с помощью метода getAmountOfEye(), так как эта переменная закрытая для внешнего мира. Код:
Цитата:
Код:
Код:
Создадим на основе класса животных классы собак и кошек. Мы наследуем свойства и методы класса животных (свойство - количество глаз; метод - возможность узнать количество глаз). И добавим к новым подклассам (собак и кошек) новый метод - возможность разговаривать на своём специализированном языке. Класс от которого происходит наследование называется базовым классом. Путём наследования, получаем два новых класса: класс "Собака" и класс "Кошека", которых объединяет общее свойство - "количество глаз" и метод - "возможность узнать количество глаз". main.cpp Код:
Цитата:
Код:
Код:
Код:
Код:
Примечание 2. Если в области protected базового находятся методы или/и свойства, то они будут доступны и в подклассах. Но не будут доступны из вне. |
||
05.02.2013, 22:49 | #2 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Полиморфизм - способность объектов по-разному реагировать на одинаковые действия.
Виды полиморфизма: - статический полиморфизм - динамический полиморфизм Статический полиморфизм реализуется с помощью шаблонов классов. Класс создаётся во время компиляции из шаблона (статическое связывание) Пример. Статический полиморфизм (шаблон класса) Из шаблона создаются два объекта. Один для работы с целыми числами, а другой для работы c вещественными. main.cpp Код:
Цитата:
Код:
Динамическое связывание происходит во время исполнения программы. Пример. Динамический полиморфизм (перезагрузка методов класса) main.cpp Код:
Цитата:
Код:
Код:
|
||
05.02.2013, 22:50 | #3 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Динамический полиморфизм (абстрактный базовый класс) может ещё реализовываться следующем образом. Пусть у нас есть абстрактный базовый класс "Животное". Создадим подклассы класса "Животное": "Кошка", "Собака". Создадим в функции main массив из "животных". Инициализируем массив объектами "Кошка" и "Собака". Теперь объекты класса "Животное" будет по-разному реагировать на вызов метода voice():
Пример. Динамический полиморфизм (абстрактный базовый класс) main.cpp Код:
Цитата:
Код:
Код:
Код:
Пример. Полиморфизм объектов В следующем примере реализовано сложение комплексных чисел с помощью переопределённого оператора '+'. Можно переопределить, к примеру, оператор '+' для класса 'Матрица'. Объекты по-разному реагируют на одинаковые действия (для объектов класса 'комплексных чисел' отдельно складываются действительные и мнимые части, а для объектов класса 'матрица' сложение будет реализовано поэлементно). main.cpp Код:
Код:
Последний раз редактировалось 8Observer8; 05.02.2013 в 23:52. |
|
05.02.2013, 23:09 | #4 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
А теперь контрольный вопрос.
Есть геометрические фигуры. Есть прямоугольники. Есть квадраты. Есть круги. Если моделировать всё перечисленное классами, то какие классы должны быть наследниками каких (и каким должно быть наследование)? Какие классы должны быть абстрактными? Про связь общей концепции полиморфизма с конкретно C++-ной синтаксической фишкой перегрузки операторов я лучше промолчу. |
05.02.2013, 23:17 | #5 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
05.02.2013, 23:49 | #6 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Цитата:
Механизм наследования позволяет реализовать специализацию. Это по материалам книги Крупника "Изучаем С++". В последним параграфе своей книги Крупник даёт ссылку на статью Ashley M. Aitken "Object Orientation Revealed!" 11 Proc. 10th Australasian Conference on Information Systems. 1999. Он использовал эту статью для написания заключительного раздела, где он подводит итог. P.S. Книгу Крупника "Изучаем С++" можно скачать здесь http://programmersforum.ru/showpost....&postcount=147 Последний раз редактировалось 8Observer8; 05.02.2013 в 23:56. |
|
05.02.2013, 23:52 | #7 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
05.02.2013, 23:55 | #8 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Просто, насколько я понял текст статьи, тут это все-таки не морковка, хотя определенно корнеплод, который нравится кроликам.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 06.02.2013 в 00:01. |
06.02.2013, 00:02 | #9 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
А что не так? Вполне логично. Классификация невозможна без механизма создания модели объекта (без инкапсуляции). В модели объекта соединяются свойства и поведение. А так же классификация невозможна без сокрытия данных.
Последний раз редактировалось 8Observer8; 06.02.2013 в 00:09. |
06.02.2013, 00:07 | #10 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Например. integer паскаля и int для .NET входят в одно и то же семейство - целые числа. Но в паскале это атомарная единица а в дотнете это объект.
I'm learning to live...
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Инструкция по созданию заготовки для 2D игр (для начинающих) | 8Observer8 | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 32 | 22.05.2024 17:55 |
C++ для начинающих | a_Alise | Помощь студентам | 2 | 27.03.2016 10:00 |
C++ для начинающих | Haruko_ | Помощь студентам | 0 | 23.10.2012 21:41 |
С++ для начинающих | Maxim1 | Общие вопросы C/C++ | 10 | 31.05.2010 00:22 |