![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
555shiro |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 3.1.2010 Репутация: нет Всего: нет |
здравствуйте!
подскажите пожалуйста где можно найти и изучить самую простенькую программу на "Классы" в качестве примера ? вообщем чем больше тем лучше! поискал в инете ничего путного не нашёл =( |
|||
|
||||
ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
azesmcar |
|
||||||||||||||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Классы - это наверное самая сложная часть C++ для новичков после указателей. Не потому что сложно понять как они работают, а сложно понять зачем они нужны. Большинство программ с использованием ООП у новичков (да и у не новичков тоже) сводятся к написанию функций в классах. Ну и какой смысл в такой программе? Чем такой способ программирования отличается от процедурного? Ничем! Очень важно понять саму концепцию ООП и тогда использование классов в программе облегчит вашу задачу. Глубокие понимание ООП придет с изучением шаблонов проектирования, но до этого еще есть время. Начнем с простого понятия класс.
Вспомним понятие структуры из языка Си; по сути это объявление нового типа, который состоит из набора объектов определенных типов, например нам нужен тип, хранящих координаты.
и еще один тип, хранящий информацию о линии. Для линии нам понадобится координаты двух точек, используем уже существующую структуру Point
теперь нам нужна функция, чтобы подсчитать длину этой линии
теперь представим тоже самое в виде класса, т.е. напишем не глобальную функцию а member функцию
в использовании изменилось не многое, но мы теперь представили нашу линию как самостоятельный объект, который умеет считать свою длину. Можем также создать классы типа Rectangle (прямоугольник), Circle (круг) ... и добавить в них свои функции, например подсчета площади. В таком виде классы не почти не отличаются от структур, хотя на самом деле в C++ класс от структуры отличается одним маленьким нюансом, но об этом потом. 3 главные парадигмы объектно-ориентированного программирования - это
Инкапсуляция дает возможность скрывать детали реализации от пользователей вашего класса, предоставляя ему удобный интерфейс для работы с объектом, но скрывая то, что его не касается, например в этом примере
объекты start и end объявлены как private, это значит, что к этим объектам может обратится только функции самого класса и друзья класса. public означает, что доступ открыт для всех protected открывает доступ только для наследников класса и его друзей например у нас есть функция, которая нужна для внутренней реализации функционала нашего класса и пользователям предоставлять доступ к ней нельзя, в таком случае она объявляется как private, дабы уберечь пользователя от случайных ошибок. Наследование позволяет расширить функционал класса, не меняя основной, например у нас есть класс TV (телевизор) который работает, имеет функции On(), Off() и ChangeChannel(), но мы хотим создать новый, революционный телевизор под маркой CoolTV, который имеет функцию блокирования каналов, в таком случае мы наследуем уже имеющуюся технологию телевизора, с его функционалом (чтобы не изобретать велосипед) и расширяем его.
тогда наш класс CoolTV будет обладать всеми функциями класса TV плюс функцией блокирования канала. Полиморфизм (динамический) позволяет динамически определять функцию, которая должна быть вызвана на основе типа объекта. Допустим у нас в классе TV есть функция show(), которая отвечает за показ изображения и нам хочется в нашей новой, современной модели изменить эту функцию так, чтобы она показывала цветное изображение.
переопределяем функцию show(), посмотрим что получилось
если мы вызываем функцию show() через указатель базового класса, вызывается функция из базового, несмотря на то, что на самом деле создан класс CoolTV (т.е. наследник). В чем же проблема? Допустим у нас есть класса RemoteControl, который уже работает с классом TV
при включении нажатии на кнопку включения (т.е. вызове функции On() из класса RemoteControl) вызывается функция On() телевизора и функция show(). В вышеупомянутом примере мы не сможем использовать наш пульт ДУ для класса телевизора CoolTV, потому что несмотря на то, что мы написали функцию вывода цветного изображения эта функция не вызывается. Это очень легко исправить и именно этим и занимается полиморфизм.
достаточно добавить ключевое слово virtual перед определением функции в базовом классе, после этого программа начнет вести себя следующим образом
и тогда нам не придется создавать еще один пульт дистанционного управления для работы с нашим цветным телевизором. Тема очень большая и все тут написать нереально, вот это то, что не поленился описать, все равно часто спрашивают, буду посылать всех сюда ![]() Может потом еще добавлю, надеюсь нигде не ошибся, много текста а я слишком ленивый, чтобы все проверять еще раз ![]() Это сообщение отредактировал(а) azesmcar - 14.4.2010, 23:40 |
||||||||||||||||||||||
|
|||||||||||||||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
структура не хранит типы.. структура, как объект, состоит из набора объектов каких-то типов.. ну а как тип, описывает это устройство. P.S. сорри за придирки, я из хороших побуждений.. P.S.S. на какую статью решился ! ![]() ![]() Это сообщение отредактировал(а) mes - 14.4.2010, 20:59 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ну нет опыта написания книг, могу термины попутать ![]()
дополняйте, исправляйте..я отредактирую, у меня нет претензий на идеал, за пол часика полностью отточить не удастся, иначе быть мне писателем а не программистом ![]() Это сообщение отредактировал(а) azesmcar - 14.4.2010, 21:11 |
||||
|
|||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Я даже могу подсказать в каком направлении работать:
Побочные эффекты: уже на стадии осмысления будут весьма и весьма вероятны рефлекторные сокращения ЖКТ даже при беглом взгляде на C++. ![]() Опережая вопрос "Что сам не напишешь?", скажу сразу: я - на стадии осмысления. ![]() P.S. "Ходят слухи", что для полного просветления можно "курнуть" ФП и осознать единство парадигм функционального и объектно-ориентированного программирования. P.P.S. Ещё можно "курнуть" Lua. Понять, что ООП бывает и без классов. Нужны то всего first-class functions и таблички. ![]() -------------------- |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Вижу, вижу. Да, и вот начало твоего ответа:
-------------------- |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
![]() ![]() P.S.
слово "единство " имхо не очень подходит на эту роль.. правда другого подходящего вспомнить также не могу ![]() ![]() Это сообщение отредактировал(а) mes - 14.4.2010, 21:37 |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
![]() Во-первых, я забыл последний пункт списка:
Во-вторых, ещё раз процитирую: Объясняющему это важно понять в первую очередь. Ничего личного! ![]() -------------------- |
|||
|
||||
ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Такое ощущение что перед тем, как отправить свой пост, kemiisto курил не только Smalltalk, Oberon-2/Component Pascal, ФП и Lua, а что-то еще
![]() Это сообщение отредактировал(а) ИванМ - 14.4.2010, 21:40 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну это к обсуждаемому напрямую не относится.. имхо, имелось ввиду : Очень важно понять саму концепцию ООП_с_точки_зрения_C++ ![]() и у автора была поправка на этот счет : ![]() Добавлено @ 21:44
Ну тогда придется предположить, что он курит это "что-то" чуть ли не постоянно ![]() даже беглый просмотр высказываний "прошлых лет" поможет убедиться в этом.. Это сообщение отредактировал(а) mes - 14.4.2010, 21:54 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
А вообще он просто за мир во всем мире, и ему обидно, что программисты как художники, используют не радужную палетту с ограниченным набором красок, изготовленную специально для удобства человека, а неподъемный набор красок и кисточек на любой вкус..
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |