Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы.doc
Скачиваний:
110
Добавлен:
01.05.2014
Размер:
583.17 Кб
Скачать

27. Создание объектов класса, использующих объекты других классов в качестве членов-данных

В принципе, членом-данным класса может являться другой класс, указатель на другой класс или ссылка на другой класс. С указателями проблем не возникает вообще. С ссылками проблема имеется, поскольку любая ссылка – константа. Её нужно инициализировать в заголовке конструктора с помощью c-tor инициализации. С реальным объектом ещё большая беда – для него в заголовке конструктора включающего класса должен быть явно вызван конструктор с параметрами. Однако, если включаемый класс имеет конструктор по умолчанию, явного вызова в заголовке включающего класса можно не делать. И ещё: если класс содержит другие классы, то сначала создаются объекты включаемых классов в порядке объявления, а затем – объект включающего класса.

28. Проектирование конструкторов класса языка С++

  1. Язык С++ позволяет для класса создать набор конструкторов.

  2. Набор конструкторов м.б. задан для класса, определяется:

  • Информацией о способах создания и задания начальных значений.

  • Способы автоматического вызова конструкторов в программах на С++

  • Механизм переопределения функций на языке С++

Набор конструкторов должен представлять согласованную систему.

Пример.

Class Point

{

int x; int y;

public:

Point (int x0; int y0)

{x=x0; y=y0;}

}

class Square

{

Point P; //требуется конструктор без параметров

unsigned int w;

public:

Square (Point Q; unsigned int w0)

{P=Q; w=w0}

}

// основная программа

Point P(4,2);

Square (p,10);

Вывод: некорректность комбинации класс Point и класс Square не обеспечивает вызов конструктора без параметров, который требуется при создании подобъекта точка при создании объекта Квадрат.

  1. Автоматический вызов конструктора класса С++ реализуется в следующих случаях:

  • При объявлении объектов в некоторых формах и задании их начальных состояний.

Пусть Т – класс

x- объект класса Т

а – объект класса Т или другого класса

Т х

Т х(а)

Т х=а

Т х=Т(а)

  • При передаче объектов в качестве параметров в тело функции.

  • При возврате значения функции с использованием ее имени.

  • При создании объектов с помощью оператора new

  • При инициализации массивов, когда инициализирующих значений меньше чем элементов массива, вызывается конструктор без параметров

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

    1. Убрать из класса Point имеющийся там конструктор и добавить конструктор без параметров

    2. Убрать конструктор с параметрами и воспользоваться конструктором предоставляемы компилятором.

    3. Добавить в конструктор значения по умолчанию.

    Задание 16. Теоретически, практически и экспериментально ответить на вопрос: если в классе объявлена функция без значений по умолчанию, можно ли добавить значения по умолчанию в 1) файле реализации

    2) в файле использующем функцию

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

    Формат списка инициализации:

    Имя_класса (список_параметров): имя_члена_данного (список выражений)

    {

    //тело конструктора

    }

    Пример:

    // реализация возможности 4.4

    Square (Point Q, unsigned int w0): P(Q1), w(w0)

    {}

    Примечание: С++ позволяет защитить передаваемые значения.

    29. Принципы проектирования классов.

    1. Создание класса является задачей проектирования, решение которого зависит от:

    • Четкого и полного понимания содержания предметной области.

    • Представления о возможном развитии решаемых задач

    • От опыта, интуиции и знаний проектировщика

  • Строгих формальных способов проектирования класса не существует.

  • Профессионалы формулируют рекомендации по построению классов, учитывающих опыт, средства реализации, тенденции развития.

    Принципы проектирования классов.

    1. Принцип явного отображения объекта в предметной области.

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

    1. Принцип прямого (непосредственного) отображения объектов в проблемной(предметной) области.

    Square

    {Point P;

    Unsigned int w;

    }

    Square

    {

    Int x; int y; /*координаты левой верхней вершины*/

    MoveToPoint (PointQ);

    }

    1. Принцип отсутствия дублирования.

    Point

    {

    int x;

    int y;

    MoveToPoint(PointQ);

    }

    Члены-данные и члены-функции должны быть заданы так, чтобы исключить наличие членов-данных одинаковых по смыслу и форме.

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

    1. Принцип ограничения доступа для пользователей класса.

    Пользователь класса должен знать о классе только то, что позволяет его использовать.

    Ограничение доступа организуется двумя действиями:

    • Ведением закрытой части класса, в которой помещается и члены-функции и члены-данные, к которым пользователь не имеет прямого доступа.

    • Ведение специальных функций для работы с членами закрытой части по правилам, установленных классом.

    1. Принцип функциональной структурности класса.

    Определение класса должно содержать функции 4-х видов:

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

    • деструкторы

    • селекторы

    • модификаторы

    При этом функции из каждой группы должны обеспечивать надежное использование объектов класса.

    Реализация: конструкторы должны полностью задавать экземпляр объекта.

    1. Принцип общей простоты и наглядности.

    Определение класса должно быть простым для понимания.

    Общая простота для понимания обеспечивается организацией текста определения ориентированной на понимание.

    Средства организации:

    • наглядные имена классов и членов;

    • компактность;

    • взаимное расположение и членов-данных и членов-функций

    1. Принцип локальной простоты и наглядности.

    Все необходимые для понимания выбранного члена класса должно быть расположено вблизи описания.

    1. Принцип модульности.

    Части описания класса должны быть разделены на части так, чтобы каждая эта часть могла быть оформлена в виде одного файла.

    Задание 17. Для каждого принципа привести примеры реализации принципа.

    30. Проектирование класса по контракту.

    1. Основное назначение контракта это определить строго условие использования его потребителем.

    2. Условия использование задаются правами и обязанностями сторон.

    3. Класс предоставляет пользователю некоторые возможности определенные при каких-то условиях и гарантирует организацию этих возможностей при выполнении этих условий.

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

    5. Возможности класса и условия их реализации описываются с помощью утверждений.

    6. Структуру контракта образуют

    • Предусловия для всех членов-функций

    • Постусловия для всех членов-функций

    • Инвариант для класса

    1. Предусловие для члена-функции класса – это высказывание о свойстве параметров и членов-данных, которые необходимы для выполнения ее назначения.

    2. Постусловие – это высказывание, описывающее свойство возвращаемое функцией значения, параметрах и членов-данных необходимых для реализации функции своего назначения.

    3. Инвариант класса определяет те свойства членов данных, которые присущи все объектам класса.

    Инвариант класса – это утверждение, которое имеет значение "истина" тогда и только тогда, когда любой метод класса, вызванный

    • с агрументами, удовлетворяющий предусловию метода;

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

    порождает объект класса, с состояние, обеспечивающим значение "истина" инварианта класса.

    1. Контракт для класса – это утверждение, включающее пред и постусловия для всех функций + инвариант класса.

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

    3. Процесс составления контракта был подробно на практических занятиях и должен быть реализован при выполнении л/р.

    31. Отношение наследования в концептуальной модели ООП. Графическое представление наследования.

    1. Ранее использование одним классом другого в форме отношения включения. Класс как модуль включал объект другого класса.

    2. Концептуальная модель ООП предоставляет вторую возможность использования другим классам. Другой класс входит в первый в качестве подмодели.

    Наследование в концептуальной модели ООП.

    1. Идея наследования состоит в заимствовании одним классом другого класса. Сам класс – модель, он заимствует другой класс как подмодель.

    2. Пусть есть два класса В и Д. В связан с Д отношением наследования, тогда и только тогда, когда имя Д имеет в своем составе все атрибуты, методы и уровни доступа В.

    3. Когда Д имеет свои собственные атрибуты, методы и уровни доступа, отличные от В.

    4. Любой объект класса Д ведет себя также, как объект класса В и может быть использован вместо него в соответствующих местах программы => правило подстановки.

    5. Отношение наследования направлено от В к Д, т.к. базовый класс порождает.

    6. Осуществить первые 2 условия можно и без наследования: переписав В в Д., объект Д м..б. подставлен во фрагменты. Объект класс Д м.б. использован во всех местах, где описан класс В.

    7. Возможность подстановки фрагментов Д в В обусловлено:

    • Модель класса В обладает теми же возможностями, входит как подмодель в класс Д.

    • Модель В входит в класс Д полностью.

    • Действует правило подстановки.

    1. При построении Д используется две возможности:

    • Класс Д добавлен в В только методы (атрибуты не добавляются)

    • Класс Д добавлен в В и атрибуты и методы.

    Эти два пути называются сценариями наследования.

    1. Семантика отношения наследования: модель класса Д включает полностью модель класса В. Класс Д получает все атрибуты и методы В. Класс Д может добавить свои атрибуты и методы в разных пропорциях. Объект класса Д может использоваться в тех участках программы, которые написаны для класса В.

    2. Существует два способа установления наследования.

    • Добавление новых атрибутов и методов (специализация)

    • Обобщение, т.е. выделение у нескольких классов общих атрибутов и методов для образования нового класса.

    P3 P2

    P1

    P

    Пример.

    class Point

    {}

    class Square

    {

    Point P;

    }

    Class Square: Point

    {

    // собственные для Square члены (атрибуты и методы)

    }

    Класс Квадрат – специализация класса Точка (больше деталей – более конкретно)

    Все фигуры находятся в наследовании класса Точка

    Обобщаем – выделяем отдельный класс.

    Обобщение направлено от производного класса к базовому.

    1. Класс может заимствовать модели либо от одного, либо от нескольких классов.

    В первом случае наследование простое, во втором – множественное.

    Графическое представление наследование (язык UML)

    Класс В

    Класс Д

    Направлено в сторону более общего.

    Класс В

    Класс Д

    Класс В1

    Класс В2

    Класс Д

    32. Задание отношения наследования в языке С++

    1. В С++ класс, который служит для построения нового называется базовым, а класс который получается – производным.

    2. Смысл отношения наследования в С++ отличается от наследования в концептуальной модели. В С++ гораздо больше возможностей, чем в концептуальной модели ООП.

    Вопросы:

      1. Какие классы могут выступать в качестве базовых?

      2. Как синтаксически задается отношение наследования?

      3. Что получает производный класс от базового?

      4. Что добавляет производный класс к базовому?

      5. Что может изменить производный класс в использовании модели базового класса в производном?

      6. Зависит ли структура и возможности (свойства) базового класса от наличия производного?

      7. Каковы возможности и способы доступа к членам базового класса из производного класса?

      8. Как выполняется конструктор базового класса?

      9. Как д.б. организованы конструкторы производного класса и как будут инициализироваться члены базового класса.

      10. Как выполняется конструктор производного класса?

      11. Как д.б. организован деструктор?

    1. Базовыми м.б. классы, определенные или объявленные как классы. Объявленные классы – хотя бы одна функция не определена.

    2. Для определения или объявления класса с помощью наследования м.б. построен производной класс.

    3. Формат задания отношения наследования.

    class

    имя_класса

    :

    спецификатор_доступа

    имя_класса

    служебное слово,

    задающее производный

    класс

    имя производного класса

    знак, задающий отношение

    наследования

    спецификатор вида наследования

    имя базового класса

    база наследования

    Спецификатор доступа: public, private, protected. Спецификатор может быть не указан, тогда по умолчанию используется private.

    Пример.

    class Point

    {

    Int x; int y;

    public:

    MoveToPoint(Point Q);

    }

    class Square: public Point

    {

    }

    1. Производный класс может добавить свои члены-данные и свои члены функции.

    class Square: private Point

    {

    unsigned int w;

    public:

    unsigned int Area();

    }

    1. Область видимости имен производного класса вложена в область видимости базового класса.

    1. В производном классе могут использоваться имена, совпадающие с именами в базовом классе.

    Пример.

    class Square: private Point

    {

    unsigned int w;

    public:

    void MoveToPoint(Point Q);

    // имя MoveToPoint класса Point скрыто таким же именем класса Square

    }

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

    Реализация влияния:

    • в базовом классе есть секция protected

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

    Наличие секций protected вызвано стремлением предоставить прямой доступ к функциям базового класса со стороны производного класса.

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

    33. Управление доступом в производном классе к членам базового класса

    1. В этом разделе речь будет идти о прямом непосредственном доступе функций производного класса к членам базового класса

    2. У членов базового класса существует перечень клиентов, которые "хотели бы" иметь доступ к этим членам.

    Этими членами являются:

    • Функции-члены базового класса

    • Функции-члены производного класса

    • Функции вне базового и вне производного классов

    • Функции, дружественные к базовому классу

    Замечание. В рамках данного курса дружественные функции рассматриваться не будут.

    1. На возможность прямого доступа влияют следующие обстоятельства.

    • Размещение членов в секциях базового класса

    • Вложение областей видимости базового и производного классов

    • Влияние спецификатора вида наследования