Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Билет №4.Классы и объекты, Члены классов. Статические члены классов.



1. Класс - принципиально новый тип данных, который создается программистом

Класс определяет собой множество объектов

– имеющих общую структуру

– обладающих одинаковым поведением.

Объект является представителем (экземпляром) какого-либо класса.

Объект обладает

– состоянием

– поведением

– идентичностью.

Состояние объекта характеризуется

– набором его свойств (атрибутов)

– текущими значениями каждого из этих свойств.

Поведение объекта - выполнения определенной последовательности характерных для него действий (методов).

Идентичность объекта – это свойство (или набор свойств) объекта, которое позволяет отличить его от всех прочих объектов того же типа (класса).

Класс – это шаблон который определяет атрибуты и методы объектов.

Пример: форма для печенья в виде буквы «А» - это не буква А, она лишь определяет, как буква А выглядит. Если вам необходим объект, представляемый классом, создаете экземпляр. Каждый экземпляр содержит те же самые атрибуты и методы, которые определены в классе. У каждого экземпляра свое собственное состояние - своя копия атрибутов. Поведение объекта определяется его методами

Связи между объектами

• Классы и объекты в рамках модели не существуют сами по себе, они связаны с другими объектами

• Для более наглядного изложения структуры классов и объектов и взаимосвязей между ними используется язык UML – унифицированный язык моделирования

(Unified Modelling Language)

2. Сам класс в итоге определяется как список своих членов, а именно полей (свойств) и методов/функций/процедур. В зависимости от языка программирования к этому списку могут добавиться константы, атрибуты и внешние определения.

3. Статические члены класса

Вы можете определить член класса как статический (static member) или член экземпляра (instance member). По умолчанию каждый член определен как член экземпляра. Это значит, что для каждого экземпляра класса делается своя копия этого члена. Когда член объявлен как статический, имеется лишь одна его копия. Статический член создается при загрузке содержащего класс приложения и существует в течение жизни приложения. Поэтому вы можете обращаться к члену, даже если экземпляр класса еще не создан. Статический метод или поле - общий для всех объектов класса. Статические методы объявляются с модификатором static. Обращение к статическим методам и полям осуществляется с помощью оператора разрешения области видимости. Внутри статических методов не доступны не-статические члены (а также this ). Статические поля необходимо явно инициализировать в файле.cpp

Константые поля встроенных типов можно инициализировать в.h файле

 

Билет №5. Интерфейс и реализация. Чисто абстрактные классы. Интерфейс как ответственность (контракт)

 

• Поведение, доступное пользователям класса (программистам) - интерфейс

 

• Класс рассматривается как «черный ящик», работать с которым можно исключительно через его интерфейс

 

Суть «черного ящика» в том, что программисту-пользователю не нужно заботиться о реализации классов, которые он использует, достаточно знать его интерфейс

Интерфейс описывает, как объект взаимодействует с внешним миром. Обратная сторона объекта связана с его реализацией. Пользователю разрешен доступ только к тому, что описано в интерфейсной части. Реализация определяет, как достигается выполнение обязанностей, заявленных в интерфейсной части.

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

 

Чисто абстрактные классы

• Классы, которые содержат n абстрактные методы называются абстрактными

• Классы, которые содержат только абстрактные методы называются чисто абстрактными

• Нельзя создать экземпляр абстрактного класса

• А указатель на абстрактный класс – можно!

• Указывает на экземпляр одного из производных классов

• Абстрактные методы должны быть переопределены в производных классах

Имеют собственное название – интерфейс

 

Интерфейс как ответственность (контракт)

• Для ООП подхода характерно «разделение труда» - каждый объект отвечает за узко определенную задачу

• Объект может решать несколько задач, например студент может решать задачи, связанные с учебой и внеучебной работой.

В таких случаях говорят, что объект играет несколько ролей

• В ООП роли описываются интерфейсами

• Чтобы «заставить» объект выполнять его задачи другие объекты используют его поведение (вызывают его методы )

• Также говорят, что используя поведение объекты посылают друг другу сообщения или запрашивают услугу

• Объекты взаимодействуют друг с другом через интерфейс (который определяется типом (классом) объекта)

• Термины «метод», «услуга», «сообщение» - синонимы

Билет №6. Иерархии в объектно-ориентированной системе

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

Примеры иерархий:

• Иерархия классов - иерархия «являться» («is-a»)

• Иерархия объектов – иерархия «быть частью» («part-of »)

• Иерархии – частные случаи связи между объектами

• Разные иерархии существуют независимо друг от друга, являются разными «плоскостями сечения» системы

 

Иерархия is-a: Наследование

 

• Отношение ( связь ) между классами:
«то» является «этим»

– родитель/потомок

– обобщение/специализация

• Наследование с точки зрения С++ это повторное использование кода

• Более общий класс –
базовый класс, суперкласс, родитель

• Более специализированный –
производный класс, подкласс, наследник, потомок

Билет №7. Полиморфизм

Полиморфизм - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций.

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

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

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

Полиморфизм в C++ реализуется с помощью наследования, виртуальных функций и указателей на базовый класс.

Деструкторы и полиморфизм

 

 

// Деструктор – виртуальный поэтому вызывается через

// таблицу виртуальных функций и вызывает деструкторы

// базовых классов

При возможности полиморфного использования (то есть практически во всех нетривиальных случаях) деструктор класса необходимо объявлять виртуальным

 

Билет №8.Типы методов

Типы методов (Операций):

Селектор (инспектор)
- Метод, считывающий состояние объекта, но не меняющий его

Модификатор (мутатор)

• Метод, меняющий состояние объекта

Конструктор

• Операция создания объекта и/или его инициализации

Деструктор

• Операция, освобождающая состояние объекта и/или разрушающая сам объект

 

Конструкторы

(Конструктор по умолчанию, Конструктор копирования, Конструктор - инициализатор, Конструктор преобразования типа, Обязательные конструкторы)

• Конструктор – метод создания и/или инициализации объекта

• Конструктор – специальный метод, который

– имеет то же имя, что и класс

– не возвращает значений

– вызывается непосредственно после выделения памяти

– не может быть вызван явно

Когда вызывается конструктор:

• При объявлении объекта:

Rational r;

Если объект глобальный, конструктор вызывается до функции main!

• При динамическом создании объекта:

Rational* r = new Rational();

• При присваивании значения не вызывается:

Rational r1, r2;

r1 = r2;

• При передаче параметров между функцией и вызывающей ее программой если параметр передается по значению:

Rational DoSomething(Rational A);

Когда и какие конструкторы нужны:

• Может ли быть класс без конструкторов?

– Нет! Конструктор по умолчанию и конструктор копирования создаются автоматически

• Автоматически созданный конструктор копирования копирует значения полей

• Явные конструкторы копирования абсолютно необходимы, если класс имеет динамические поля

• Все остальные конструкторы определяются исходя из соображений удобства использования

Конструкторы и наследование:

• Конструктор класса-потомка должен вызывать конструктор прямого предка. При этом:

– при отсутствии явного вызова конструктора предка неявно (автоматически) вызывается конструктор предка по умолчанию

– при необходимости конструктор потомка может явно вызвать конструктор предка любого типа (но только один! )

– конструктор предка должен быть указан в списке инициализации потомка

• «Многоуровневый объект» конструируется «сверху-вниз» от предков к потомкам – сначала инициализация предков, затем потомков

Деструкторы

• Деструктор — специальный метод, который вызывается перед освобождением памяти занимаемой объектом

• Деструктор вызывается:

– только неявно (автоматически) – при удалении объекта из стэка

– при удалении динамического объекта:

Rational * c1 = new Rational();

delete c1;

• Функции деструктора:

– освобождение памяти, занимаемой динамическими полями объекта

– любые завершающие действия, которые необходимо выполнить вместе с удалением объекта

 

• Компилятор всегда автоматически создает «пустой» деструктор

• В случае, если класс содержит поля-указатели, явное написание деструкторов является абсолютно необходимым

• Явная реализация конструкторов и деструкторов является «хорошим тоном»

(Деструктор – виртуальный поэтому вызывается через


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 774; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь