Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ооп.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
300.54 Кб
Скачать

1.5. Перегрузка операций

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

Перегрузка операций дает возможность переопределить С++. Это механизм, который дает возможность определить новые операции над объектами.

Для определения нового оператора используется ключевое слово operator. Операторы определяются внутри класса, по такому же принципу как обычные методы класса, как внутри класса, так и вне него.

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

Так, если мы напишем ob++, то в классе, к которому относится объект, должен быть определен оператор «++», иначе компилятор не сможет выполнить эту операцию, т.к. все операции языка С++ определены для базовых типов данных.

Формат записи перегрузки унарных операций:

тип_возвр_значения operator «операция» (список аргументов)

{тело оператора}

например: void operator ++()

{…..}

Формат перегрузки бинарных операций:

Тип_возвр_значения operator «операция» (объект)

{тело оператора

Пример:

class myclass

{

int x, y;

public:

coord () {x=0; y=0;} //конструктор

coord operator + (coord ob2); //Бинарная операция «+»

coord operator +();//унарная операция «+»

};

coord coord:: operator +(coord ob2) //реализация бинарной операции «+»

{ coord temp;

temp.x=x+ob2.x;

temp.y=y+ob2.y;

return temp;

}

coord coord::operator +() //реализация унарной операции «+»

{ coord temp;

x=+x;

y=+y;

return *this;

}

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

. Перегрузка унарных операций

Любая унарная операция @ может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. В первом случае выражение @ Z означает вызов Z.operator @(), во втором - вызов operator @(Z).

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

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

Синтаксис:

а) в первом случае (описание в области класса):

тип_возвр_значения operator знак_операции

б) во втором случае (описание вне области класса):

тип_возвр_значения operator знак_операции (идентификатор_типа)

Перегрузка бинарных операций

Любая бинарная операция @ может быть определена двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x @ y означает вызов x.operator @(y), во втором – вызов operator @(x, y).

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

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

6 Конструкторы и деструкторы. Определение и назначение. Конструкторы без параметров.

Конструкторы и деструкторы

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

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

Конструктор имеет имя, совпадающее с именем класса, и не имеет возвращаемого значения. Формат описания конструктора следующий:

Имя_класса (список_формальных параметров)

{ тело конструктора}

Т.о. конструктор используется для инициализации объекта.

Пример:

class myclass

{

private:

int x,y;

public:

myclass () {x=0; y=5;} //конструктор

~myclass(){} //деструктор

……..

}

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

Формат задания деструктора совпадает с форматом задания конструктора, но перед именем класса задается знак «~» (тильда).

Деструктор класса – это функция, автоматически вызываемая при удалении объекта.

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

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

Адреса конструктора и деструктора получить невозможно.

Конструктор можно создавать с параметрами, т.е. при создании объекта конструктору можно передавать параметры.

В этом случае формат конструктора следующий:

Имя_класса (список формальных параметров)

{тело конструктора}

Тогда формат записи создания объекта следующий:

Имя_класса имя_объекта(фактические параметры_конструктора);

Или

Имя_класса (фактические_параметры_конструктора);

Первая форма допускается только при непустом списке параметров. Она предусматривает вызов конструктора при определении нового объекта данного класса.

Вторая форма явного вызова конструктора приводит к созданию объекта, не имеющего имени.

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

Существует два способа инициализации данных с помощью конструкторов:

  1. Передача параметров в тело конструктора;

  2. Применение списка инициализаторов данных объекта. Этот список помещается между списком параметров и телом конструктора.

Имя_класса (список параметров): список_инициализаторов_компонентных данных

{Тело конструктора}

Каждый инициализатор списка относится к конкретному компоненту имеет вид - имя_компонента_данных (выражение)

Пример:

class A

{ int ii;

float ee;

char cc;

public:

A(int in, float en, char cn): ii(5),ee(ii*en+in), cc(cn)) {}

A () {ii=1; ee=5.0; cc=’f’;}

};

main ()

{

A A1(2,3.0, ‘d’);

A A2;

………

}

  1. Перегрузка бинарных операций.