Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_IGME.doc
Скачиваний:
9
Добавлен:
01.05.2025
Размер:
3.64 Mб
Скачать
  1. Понятие класса. Управляющие предметные интерфейсные контейнерные классы. Методы классов конструктор, деструктор, аксессор, мутатор. Перегрузка классов и методов.

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

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

Существует 2 способа включения метода в класс:

  1. Определение метода при описании класса.

  2. Объявление метода при описании, а его описание - при вызове.

Методы, определенные внутри класса, являются неявно встроенными.

Пример.

class A     {     int x, y;     int sum ( ) { return (x + y) ; }     } ;  Для определения метода вне класса укажите имя класса, за ним знак :: и имя функции-члена. Официальное название двойного двоеточия - оператор разрешения области действия. Он указывает, что данная функция-член является частью определенного класса.

Пример.

Class B     {     int x, y;    int sum ( )     } ; int B::sum ( ) { return (x + y) ; } Также как и структуры, классы можно задавать либо статически, либо динамически. Например,      статически - Toplist    foo;     динамически - Toplist *bar ; bar=new Toplist; Для статических и динамических классов применимы те же правила и принципы, что и для статических и динамических переменных. Объект - экземпляр класса.

В объектно-ориентированной программе встречаются классы трех основных видов:  - управляющие классы (Control classes). Они не занимаются обработкой данных и не продуцируют видимого результата. Вместо этого они управляют ходом выполнения программы. Например, классы приложения представляют саму программу. В большинстве случаев каждая программа создает ровно один класс приложения. В его задачи входит запуск программы, обнаружение факта выбора из меню и выполнение кода программы в соответствии с запросами пользователя;  - предметные классы (Entity classes). Они используются для создания объектов, занимающихся обработкой данных. Например, класс Счет относится к предметным. Классы, представляющие людей, материальные объекты и события (например, деловые совещания) являются предметными. В большинстве объектно-ориентированных программ есть хотя бы один предметный класс, по которому создаются объекты. На самом деле в простейшем случае объектно-ориентированная модель данных строится из представления связей между объектами, созданными на основе предметных классов.  - интерфейсные классы (Interface classes) Они занимаются вводом и выводом информации. Например, при работе с графическим пользовательским интерфейсом, то каждое окно или меню, встречающееся в программе, является объектом интерфейсного класса. 

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

- конструктор (Constructor) - метод, имя которого совпадает с именем класса. Он выполняется при создании объекта. Поэтому конструктор обычно содержит инструкции по инициализации переменных объекта;  - деструктор (Destructor) - метод, выполняемый при уничтожении объекта. Не во всех объектно-ориентированных языках есть деструкторы. Обычно они применяются для освобождения системных ресурсов - например, оперативной памяти, - занимаемых объектом;  - методы чтения (Accessors) - еще их называют get-методами - возвращают значение закрытого атрибута объекта. Именно так внешние объекты обычно получают доступ к инкапсулированным данным.  - методы изменения (Mutators), set-методы, устанавливают новое значение атрибута. Таким образом, внешние объекты изменяют инкапсулированные данные. 

  1. Понятие конструктора в языках объектно-ориентированной парадигмы программирования. Назначение, свойства. Копирующий конструктор. Деструкторы. Назначение, свойства. Пример программы с использованием конструктора и деструктора.

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

Основные свойства конструкторов:

- Конструктор не возвращает значение, даже типа void. Нельзя получить указа­тель на конструктор.

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

  • Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

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

  • Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы по умолчанию базовых классов. В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а кон­структор по умолчанию этого делать не умеет.

  • Конструкторы не наследуются.

  • Конструкторы нельзя описывать с модификаторами const, virtual и static.

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

  • Конструктор вызывается, если в программе встретилась какая-либо из син­таксических конструкций:

имя_класса имя_объекта [(список параметров)];

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

T::T(const T&) { ... /* Тело конструктора */ }

где Т — имя класса.

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

  • при описании нового объекта с инициализацией другим объектом;

  • при передаче объекта в функцию по значению;

  • при возврате объекта из функции, а также при обработки исключений.

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

Любой конструктор класса, принимающий один параметр какого-либо другого типа, назы­вается конструктором преобразования, поскольку он осуществляет преобразование из типа параметра в тип этого класса

Пример:

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

#include <iostream.h>

#include <string.h>

class TString

{ public:

TString(); // конструктор без параметров

TString(int n, char* s=0); // конструктор, создающий пустую строку

/* конструктор, преобразующий массив из char с завершающим нулем

в тип TString */

TString(char* s);

TString(TString& st); // конструктор копирования

~TString(); // деструктор

void print(); // вывод строки на экран

int sz; // длина строки

char* ps; // указатель на память для хранения строки

};

/* Методы класса TString */

TString::TString( ){sz=0; ps=0;}

TString::TString(int n, char* s)

{ sz=n; ps=new char[n+1];

strncpy(ps,s,n); ps[sz]='\0';

}

TString::TString(char* s)

{ sz=strlen(s)+1; ps=new char[sz];

strcpy(ps,s);

}

TString::TString(TString& str)

{ sz = str.sz; ps=new char[sz+1];

strcpy(ps,str.ps);

}

TString::~TString( )

{ if (ps != 0) delete [] ps; }

void TString::print( )

{ if (sz == 0 )

{ cout << " Строка пустая "<< endl; return;}

cout<<" Строка = "<< ps <<endl;

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

- для локальных объектов — при выходе из блока, в котором они объявлены;

- для глобальных — как часть процедуры выхода из main;

- для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса. Деструктор: не имеет аргументов и возвращаемого значения; не может быть объявлен как const илиstatic; не наследуется; может быть виртуальным.

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

Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически — иначе при уничто­жении объекта память, на которую ссылались его поля-указатели, не будет поме­чена как свободная. Указатель на деструктор определить нельзя.

Деструктор должен выглядеть так:

monstr::~monstr() {delete [ ] name;}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]