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

Блокировка копирования и присваивания:

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

private :

A ( A& );

A operator = ( A &) ;

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

Преобразование типов в классах пользователя

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

Это можно сделать с помощью перегруженного конструктора класса или с помощью операции – функции преобразования типов.

Рассмотрим опять класс Complex.

Недостаток описания состоит в том, что нельзя выполнять комплексные операции комплексного числа с арифметическими данными:

Complex c1( 5.5, 6.5);

Complex c2= c1+ 2;

Complex c2= c1+ ‘0’;

В этом случае компилятор будет пытаться создать временный объект Complex (2), но наш конструктор с двумя параметрами, поэтому скомпилировать нам это не удастся.

Надо объявить конструктор такого вида:

Complex (float r =0, float i =0)

{ re = r ; im = i ; },

который позволит, например, создавать объекты:

Complex c1( 1.5, 2.5);

Complex c1( 4.5);

Complex c1;

Рассмотрим операторы описанные выше:

  1. 2 преобразуется к 2.0 ,затем создается временный объект, вызовом конструктора с умалчиваемыми значениями , с данными(2.0, 0.0) .

В результате создается объект с2 с данными (7.5, 6.5).

2) ‘0’ преобразуется в целое 48, которое преобразуется в вещественное

48.0, создается временный объект с данными ( 48.0, 0.0).

В результате создается объект с данными (53.5, 6.5).

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

Проблема решается с помощью специального оператора преобразования типа.

Рассмотрим это преобразование для класса stroka. Преобразование типа stroka в тип char*.

Чтобы объекты класса можно было бы передавать функциям модуля string.h, надо в описание класса включить компонентную функцию:

1)

operator char* ( ) { return ch; } (1)

И тогда в предложении

stroka s1(“string”)

char* s = s1;

произойдет преобразование объекта s1 к типу char* , правило (1), и переменной s присвоится значениеstring”.

2)

Аналогично можно определить в классе преобразование:

operator int ( ) { return len; } (2)

И тогда в предложении :

int l = s1;

переменная класса (объект s1) преобразуется к целому значению по правилу описанному в операторе преобразования (2).

Вопросы:

  1. В чем суть объектно-ориентированного подхода к программированию? Дать определение класса.

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

  1. Обращение к компонентам объекта

  1. Что такое статический элемент класса

  1. Что такое друзья класса

  1. Что такое конструкторы и деструкторы. Какие типы конструкторов вы знаете?

  1. Когда необходимо описывать конструктор копирования?