Скачать презентацию ПЕРЕГРУЗКА Перегрузка функций Использование одного имения для Скачать презентацию ПЕРЕГРУЗКА Перегрузка функций Использование одного имения для

Перегрузка.pptx

  • Количество слайдов: 17

ПЕРЕГРУЗКА ПЕРЕГРУЗКА

Перегрузка функций Использование одного имения для нескольких функций ⦿ Каждое переопределение функции должно использовать: Перегрузка функций Использование одного имения для нескольких функций ⦿ Каждое переопределение функции должно использовать: ⦿ ● либо другие типы параметров ● либо другое количество параметров Эти различия позволяют компилятору определить, какую функцию следует вызвать в том или ином случае ⦿ Тип возвращаемого значения не позволяет перегружать функцию ⦿

Пример перегруженной функции для разных типов параметров Пример перегруженной функции для разных типов параметров

Пример перегруженной функции для разного количества параметров Пример перегруженной функции для разного количества параметров

Неправильная перегрузка ⦿ int myfunc(int i); ⦿ float myfunc(int i); ⦿ void f(int *p); Неправильная перегрузка ⦿ int myfunc(int i); ⦿ float myfunc(int i); ⦿ void f(int *p); ⦿ void f(int p[]); Объясните, почему данные варианты перегрузки функции неверны

Перегрузка конструкторов Причины использования перегрузки конструкторов: ⦿ гибкость ⦿ возможность создания инициализированных (неинициализированных) объектов Перегрузка конструкторов Причины использования перегрузки конструкторов: ⦿ гибкость ⦿ возможность создания инициализированных (неинициализированных) объектов ⦿ возможность создания конструкторов копирования

Перегрузка конструкторов для достижения гибкости ⦿ Перегруженные конструкторы позволяют создавать объекты класса разными способами: Перегрузка конструкторов для достижения гибкости ⦿ Перегруженные конструкторы позволяют создавать объекты класса разными способами: ● для каждого способа создания объекта определяется отдельный вариант перегруженного конструктора ● пользователь имеет возможность выбора оптимального способа создания объекта ● если подходящего конструктора не будет, то компилятор выдаст сообщение об ошибке

В данном примере объект класса date можно инициализировать двумя способами: 1) месяц, день и В данном примере объект класса date можно инициализировать двумя способами: 1) месяц, день и год задаются тремя целыми числами 2) месяц день год задаются в виде строки mm/dd/yyyy

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

Конструктор копирования ⦿ Позволяет предотвратить проблемы, которые могут возникнуть присваивании одного объекта другому Конструктор копирования ⦿ Позволяет предотвратить проблемы, которые могут возникнуть присваивании одного объекта другому

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

Объект выделяет динамическую память Пусть класс My. Class выделяет динамическую память для каждого создаваемого Объект выделяет динамическую память Пусть класс My. Class выделяет динамическую память для каждого создаваемого объекта, объект А – экземпляр класса My. Class ⦿ Это значит, что объект А выделил для себя динамическую память ⦿ Пусть My. Class В = А ⦿ Объект В – точная копия объекта А, то есть он ссылается на область памяти, выделенную объектом А ⦿ Если класс My. Class содержит деструктор, освобождающий память: при уничтожении объектов А и В одна и та же область память будет освобождаться дважды ⦿

Решение проблемы: конструктор копирования ⦿ Конструктор копирования не использует побитовое копирование имя_класса(const имя_класса &ссылка_на_объект) Решение проблемы: конструктор копирования ⦿ Конструктор копирования не использует побитовое копирование имя_класса(const имя_класса &ссылка_на_объект) { // тело конструктора } Ссылка на объект связана с объектом, стоящим в правой части инициализации ⦿ Конструктор копирования может иметь дополнительные параметры, однако первым параметром обязательно должна быть ссылка на инициализирующий объект

Использование конструктора копирования Существует две ситуации, в которых один объект может присваиваться другому: ⦿ Использование конструктора копирования Существует две ситуации, в которых один объект может присваиваться другому: ⦿ при выполнении оператора присваивания ⦿ при инициализации: ● явная инициализация, например, при объявлении объекта ● создание копии объекта, передаваемого функции в качестве параметра ● создание временного объекта (чаще всего, при возврате значения функции) ⦿ Конструктор копирования применяется только при инициализации

Пример использования явного конструктора копирования Программа создает очень ограниченный и «безопасный» целочисленный массив, предотвращающий Пример использования явного конструктора копирования Программа создает очень ограниченный и «безопасный» целочисленный массив, предотвращающий выход индекса за пределы допустимого диапазона Так как для каждого элемента массива память выделяется с помощью оператора new, для их инициализации применяется конструктор копирования При вызове конструктора копирования для нового массива выделяется область динамической памяти Указатель на ее первую ячейку хранится в указателе x. p Объекты x и num содержат одинаковые элементы, но каждый из них занимает отдельную область памяти