Перегрузка.pptx
- Количество слайдов: 17
ПЕРЕГРУЗКА
Перегрузка функций Использование одного имения для нескольких функций ⦿ Каждое переопределение функции должно использовать: ⦿ ● либо другие типы параметров ● либо другое количество параметров Эти различия позволяют компилятору определить, какую функцию следует вызвать в том или ином случае ⦿ Тип возвращаемого значения не позволяет перегружать функцию ⦿
Пример перегруженной функции для разных типов параметров
Пример перегруженной функции для разного количества параметров
Неправильная перегрузка ⦿ int myfunc(int i); ⦿ float myfunc(int i); ⦿ void f(int *p); ⦿ void f(int p[]); Объясните, почему данные варианты перегрузки функции неверны
Перегрузка конструкторов Причины использования перегрузки конструкторов: ⦿ гибкость ⦿ возможность создания инициализированных (неинициализированных) объектов ⦿ возможность создания конструкторов копирования
Перегрузка конструкторов для достижения гибкости ⦿ Перегруженные конструкторы позволяют создавать объекты класса разными способами: ● для каждого способа создания объекта определяется отдельный вариант перегруженного конструктора ● пользователь имеет возможность выбора оптимального способа создания объекта ● если подходящего конструктора не будет, то компилятор выдаст сообщение об ошибке
В данном примере объект класса date можно инициализировать двумя способами: 1) месяц, день и год задаются тремя целыми числами 2) месяц день год задаются в виде строки mm/dd/yyyy
Создание инициализированных и неинициализированных объектов ⦿ Данный вариант использования конструкторов особенно важен при создании динамических массивов объектов, которые невозможно проинициализировать: ● создать конструктор, создающий неинициализированный массив объектов ● конструктор, создающий объекты и присваивающий им некое начальное значение
Конструктор копирования ⦿ Позволяет предотвратить проблемы, которые могут возникнуть присваивании одного объекта другому
Пример проблемы для решения которой необходим конструктор копирования ⦿ По умолчанию, если один объект инициализируется другим, то создается побитовая копия присваиваемого объекта ⦿ Проблема: побитовая копия может быть неприемлемой, обычно это возможно: ● когда объект выделяет динамическую память ● когда функции передается копия параметра ● когда создается временный объект, возвращаемый функцией
Объект выделяет динамическую память Пусть класс My. Class выделяет динамическую память для каждого создаваемого объекта, объект А – экземпляр класса My. Class ⦿ Это значит, что объект А выделил для себя динамическую память ⦿ Пусть My. Class В = А ⦿ Объект В – точная копия объекта А, то есть он ссылается на область памяти, выделенную объектом А ⦿ Если класс My. Class содержит деструктор, освобождающий память: при уничтожении объектов А и В одна и та же область память будет освобождаться дважды ⦿
Решение проблемы: конструктор копирования ⦿ Конструктор копирования не использует побитовое копирование имя_класса(const имя_класса &ссылка_на_объект) { // тело конструктора } Ссылка на объект связана с объектом, стоящим в правой части инициализации ⦿ Конструктор копирования может иметь дополнительные параметры, однако первым параметром обязательно должна быть ссылка на инициализирующий объект
Использование конструктора копирования Существует две ситуации, в которых один объект может присваиваться другому: ⦿ при выполнении оператора присваивания ⦿ при инициализации: ● явная инициализация, например, при объявлении объекта ● создание копии объекта, передаваемого функции в качестве параметра ● создание временного объекта (чаще всего, при возврате значения функции) ⦿ Конструктор копирования применяется только при инициализации
Пример использования явного конструктора копирования Программа создает очень ограниченный и «безопасный» целочисленный массив, предотвращающий выход индекса за пределы допустимого диапазона Так как для каждого элемента массива память выделяется с помощью оператора new, для их инициализации применяется конструктор копирования При вызове конструктора копирования для нового массива выделяется область динамической памяти Указатель на ее первую ячейку хранится в указателе x. p Объекты x и num содержат одинаковые элементы, но каждый из них занимает отдельную область памяти