Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 10.1






 

//FIG6_3.cpp

//Класс Time

#include < iostream.h>

//Определение абстрактного типа данных (АТД) Time

class Time

{

public:

Time();

void setTime(int, int, int); //установка часов, минут и секунд

void printMilitary(); //печать времени в военном формате

void printStandard(); //печать времени в стандартном формате

 

private:

int hour; //0-23

int minute; //0-59

int second; //0-59

};

//Конструктор Time присваивает нулевые начальные значения каждому элементу данных. Обеспечивает согласованое начальное состояние всех объектов Time

Time:: Time() {hour = minute = second = 0; }

//Задание нового значения Time в виде военного времени.

//Проверка правильности значений данных.

//Обнуление неверных значений.

void Time:: setTime(int h, int m, int s)

{

hour = (h > = 0 & & h < 24)? h: 0;

minute = (m > = 0 & & m < 60)? m: 0;

second = (s > = 0 & & s < 60)? s: 0;

}

//Печать времени в военном формате

void Time:: printMilitary()

{

cout < < (hour < 10? " 0": " ")< < hour< < ": " < < (minute < 10? " 0": " ")< < minute < < ": " < < (second < 10? " 0": " ") < < second;

}

//Печать времени в стандартном формате

void Time:: printStandard()

{

cout < < ((hour == 0 || hour == 12)? 12: hour % 12)< < ": " < < (minute < 10? " 0": " ")< < minute < < ": " < < (second < 10? " 0": " ") < < second < < (hour < 12? " AM": " PM");

}

//Формирование проверки простого класса Time

main()

{

Time t; //определение экземпляра объекта t класса Time

cout < < " Начальное значение военного времени равно ";

t.printMilitary();

cout < < endl < < " Начальное значение стандартного времени равно ";

t.printStandard();

t.setTime(13, 27, 6);

cout < < endl < < endl < < " Военное время после setTime равно ";

t.printMilitary();

cout< < endl< < " Стандартное время после setTime равно ";

t.printStandard();

t.setTime(99, 99, 99); //попытка установить неправильные значения

cout < < endl < < endl < < " После попытки неправильной установки: " < < endl < < " Военное время: ";

t.printMilitary();

cout < < endl < < " Стандартное время: ";

t.printStandard();

cout < < endl;

return 0;

}

Инкапсуляция. Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект.

Применяя инкапсуляцию, мы, защищаем данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это на много упрощает процесс поиска и исправления этих ошибок. Можно сказать, что инкапсуляция подразумевает под собой скрытие данных (data hiding), что позволяет защитить эти данные.

Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов (операций).

Этот принцип позволяет защитить переменные состояния объекта от неправильного их использования. Это существенно ограничивает возможность введения объекта в недопустимое состояние и/или несанкционированное разрушение этого объекта.

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

Применение этого метода ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов(переменных) объекта. Однако, при современном уровне развития вычислительной техники, эти потери в эффективности не играют существенной роли.

Абстрактный тип данных - это группа тесно связанных между собой данных и методов (функций), которые могут осуществлять операции над этими данными.

Поскольку подразумевается, что эта структура защищена от внешнего влияния, то она считается инкапсулированной структурой. Важным же отличием от других аналогичных структур является то, что данные заключенные в этой структуре, тесно связанны и активно взаимодействуют между собой внутри структуры. Подобные структуры имеют слабые связи с внешним миром посредством ограниченного интерфейса. Суть подобных структур довольно проста: данные имеют тесные взаимосвязи внутри структуры, но слабые связи с внешним миром посредством ограниченного числа методов. Таким образом, структуры подобного рода имеют достаточно простой, но эффективный интерфейс, что позволяет их легко интегрировать в программах.

Наследование (Inheritance). Наследование - это процесс, посредством которого один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него.

Смысл и универсальность наследования заключается в том, что не надо каждый раз заново (с нуля) описывать новый объект, а можно указать родителя (базовый класс) и описать отличительные особенности нового класса. В результате, новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.

В описаниях языков ООП принято класс, из которого наследуют называть родительским классом (parent class) или основой класса (base class). Класс, который получаем в результате наследования называется порожденным классом (derived or child class). Родительский класс всегда считается более общим и развернутым. Порожденный же класс всегда более строгий и конкретный, что делает его более удобным в применении при конкретной реализации.

Новый, или производный класс может быть определен на основе уже имеющегося, или базового. При этом новый класс сохраняет все свойства старого: данные объекта базового класса включаются в данные объекта производного, а методы базового класса могут быть вызваны для объекта производного класса, причем они будут выполняться над данными включенного в него объекта базового класса. Иначе говоря, новый класс наследует как данные старого класса, так и методы их обработки.

Наследование нужно, для того чтобы расширить уже созданные абстрактные классы новыми свойствами или действиями. Есть несколько правил наследования классов:

1. Создаётся иерархия классов, где классы стоящие ниже по иерархии могут иметь доступ к переменным и функциям выше стоящих классов.

2. Классы стоящие ниже по иерархии- производные классы, относительно классов, которые стоят выше них (4, 5 - производные относительно 2, а 8, 9 - производные относительно 7).

3. Классы, которые состоят выше по иерархиям являются базовыми для ниже стоящих классов (1 - базовый для 2 и 3).

4. Понятие базового и производного класса не предполагают относительность уровня иерархи, т.е. то множество классов, которое стоят на один уровень выше и являются базовыми.

5. Каждый производный класс имеет множество непосредственных родителей, т.е. то множество классов, которые стоят на один уровень выше и являются базовыми.

6. Соответственно: если родитель один- простое наследование, в другом же случае- множественное наследование.

7. Начало иерархии компьютера - это класс, один или более, которые называются протоклассом плюс корень дерева. Обычно бывает 2 или 3 протокласса на практике. Обычно протокол являются пустыми или состоят из пустых виртуальных функций. (Виртуальной называется функция, сущность которой определяется во время выполнения программы.)

8. Классы стоящие ниже по иерархии имеют дополнительные свойства и функции относительно вышестоящих классов.

Концепция наследования позволяет создавать новые классы, которые используют переменные и функции уже существующих его класса, но не содержит их в своём теле.

Когда один класс наследуется другим, используется следующая форма записи:

 

class имя_производного_класса: сп_доступа имя_базового_класса

{

//….

}

 

Здесь сп_доступа – это одно из трех ключевых слов: public, private или protected. Спецификатор доступа определяет, как элементы базового класса наследуются производным классом. Если спецификатором доступа наследуемого базового класса является ключевое слово public, то все открытые члены базового класса остаются открытыми и в производном. Если спецификатором доступа наследуемого базового класса является ключевое слово private, то все открытыте члены базового класса в производном классе становятся закрытыми. В обоих случаях все закрытые члены базового класса в производном классе остаются закрытыми и недоступными. Важно понимать, что если спецификатором доступа является ключевое слово private, то хотя открытые члены базового класса становятся закрытыми в производном, они остаются доступными для функций – членов производного класса.

Технически сецификатор доступа необязателен.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.