SlideShare a Scribd company logo
1 of 9
Download to read offline
Программирование на языке C++
Лекция 3
Конструктор копирования и оператор
присваивания
Александр Смаль
1/9
Копирование объектов
struct IntArray {
...
private:
size_t size_;
int * data_;
};
int main () {
IntArray a1 (10);
IntArray a2 (20);
IntArray a3 = a1; // копирование
a2 = a1; // присваивание
return 0;
}
2/9
Конструктор копирования
Если не определить конструктор копирования, то он
сгенерируется компилятором.
struct IntArray {
IntArray(IntArray const& a)
: size_(a.size_), data_(new int[size_ ])
{
for (size_t i = 0; i != size_; ++i)
data_[i] = a.data_[i];
}
...
private:
size_t size_;
int * data_;
};
3/9
Оператор присваивания
Если не определить оператор присваивания, то он тоже
сгенерируется компилятором.
struct IntArray {
IntArray & operator =( IntArray const& a)
{
if (this != &a) {
delete [] data_;
size_ = a.size_;
data_ = new int[size_ ];
for (size_t i = 0; i != size_; ++i)
data_[i] = a.data_[i];
}
return *this;
}
...
};
4/9
Метод swap
struct IntArray {
void swap(IntArray & a) {
size_t const t1 = size_;
size_ = a.size_;
a.size_ = t1;
int * const t2 = data_;
data_ = a.data_;
a.data_ = t2;
}
...
private:
size_t size_;
int * data_;
};
5/9
Метод swap
Можно использовать функцию std::swap и файла algorithm.
#include <algorithm >
struct IntArray {
void swap(IntArray & a) {
std:: swap(size_ , a.size_ );
std:: swap(data_ , a.data_ );
}
...
private:
size_t size_;
int * data_;
};
6/9
Реализация оператора = при помощи swap
struct IntArray {
IntArray(IntArray const& a)
: size_(a.size_), data_(new int[size_ ]) {
for (size_t i = 0; i != size_; ++i)
data_[i] = a.data_[i];
}
IntArray & operator =( IntArray const& a) {
if (this != &a)
IntArray(a). swap (* this );
return *this;
}
...
private:
size_t size_;
int * data_;
};
7/9
Запрет копирования объектов
Для того, чтобы запретить копирование, нужно объявить
конструктор копирования и оператор присваивания как
private и не определять их.
struct IntArray {
...
private:
IntArray(IntArray const& a);
IntArray & operator =( IntArray const& a);
size_t size_;
int * data_;
};
8/9
Методы, генерируемые компилятором
Компилятор генерирует четыре метода:
1. конструктор по умолчанию,
2. конструктор копирования,
3. оператор присваивания,
4. деструктор.
Если потребовалось переопределить конструктор копирования,
оператор присваивания или деструктор, то нужно
переопределить и остальные методы из этого списка.
9/9

More Related Content

What's hot

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонахDEVTYPE
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 МетодыDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторыDEVTYPE
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызововDEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 СтруктурыDEVTYPE
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методыDEVTYPE
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inlineDEVTYPE
 
Proizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiProizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiDimon4
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-выводDEVTYPE
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friendDEVTYPE
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Pythondudarev
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
контрольная работа Variant i
контрольная работа Variant iконтрольная работа Variant i
контрольная работа Variant ileshiy_AlisA
 
Красивая 64-битная ошибка на языке Си
Красивая  64-битная ошибка на языке СиКрасивая  64-битная ошибка на языке Си
Красивая 64-битная ошибка на языке СиTatyanazaxarova
 
контрольная работа Variant ii
контрольная работа Variant iiконтрольная работа Variant ii
контрольная работа Variant iileshiy_AlisA
 
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...Oleksii Chepok
 

What's hot (20)

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
 
Proizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiProizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkcii
 
лекция 3
лекция 3лекция 3
лекция 3
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
контрольная работа Variant i
контрольная работа Variant iконтрольная работа Variant i
контрольная работа Variant i
 
Красивая 64-битная ошибка на языке Си
Красивая  64-битная ошибка на языке СиКрасивая  64-битная ошибка на языке Си
Красивая 64-битная ошибка на языке Си
 
контрольная работа Variant ii
контрольная работа Variant iiконтрольная работа Variant ii
контрольная работа Variant ii
 
Cтандартные функции
Cтандартные функцииCтандартные функции
Cтандартные функции
 
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...
Разработка_метода_отображения_укладки_генеральных_грузов_в_грузовых_помещения...
 

Viewers also liked

6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. StreamsDEVTYPE
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в JavaDEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 НаследованиеDEVTYPE
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладкаDEVTYPE
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++DEVTYPE
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программированиеDEVTYPE
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 СсылкиDEVTYPE
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивыDEVTYPE
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 КонстантностьDEVTYPE
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в JavaDEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математикаDEVTYPE
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классовDEVTYPE
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системеDEVTYPE
 

Viewers also liked (14)

6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивы
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в Java
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 

Similar to 3.7 Конструктор копирования и оператор присваивания

Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5Dima Dzuba
 
Архитектура корпоративных систем
Архитектура корпоративных системАрхитектура корпоративных систем
Архитектура корпоративных системConstantin Kichinsky
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 

Similar to 3.7 Конструктор копирования и оператор присваивания (6)

Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Архитектура корпоративных систем
Архитектура корпоративных системАрхитектура корпоративных систем
Архитектура корпоративных систем
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреDEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойстваDEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистикаDEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространствоDEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform ContinuityDEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change ProblemDEVTYPE
 
Recurrences
RecurrencesRecurrences
RecurrencesDEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функцийDEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of FunctionsDEVTYPE
 
Кучи
КучиКучи
КучиDEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование ХаффманаDEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введениеDEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиDEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делительDEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа ФибоначчиDEVTYPE
 
О-символика
О-символикаО-символика
О-символикаDEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

3.7 Конструктор копирования и оператор присваивания

  • 1. Программирование на языке C++ Лекция 3 Конструктор копирования и оператор присваивания Александр Смаль 1/9
  • 2. Копирование объектов struct IntArray { ... private: size_t size_; int * data_; }; int main () { IntArray a1 (10); IntArray a2 (20); IntArray a3 = a1; // копирование a2 = a1; // присваивание return 0; } 2/9
  • 3. Конструктор копирования Если не определить конструктор копирования, то он сгенерируется компилятором. struct IntArray { IntArray(IntArray const& a) : size_(a.size_), data_(new int[size_ ]) { for (size_t i = 0; i != size_; ++i) data_[i] = a.data_[i]; } ... private: size_t size_; int * data_; }; 3/9
  • 4. Оператор присваивания Если не определить оператор присваивания, то он тоже сгенерируется компилятором. struct IntArray { IntArray & operator =( IntArray const& a) { if (this != &a) { delete [] data_; size_ = a.size_; data_ = new int[size_ ]; for (size_t i = 0; i != size_; ++i) data_[i] = a.data_[i]; } return *this; } ... }; 4/9
  • 5. Метод swap struct IntArray { void swap(IntArray & a) { size_t const t1 = size_; size_ = a.size_; a.size_ = t1; int * const t2 = data_; data_ = a.data_; a.data_ = t2; } ... private: size_t size_; int * data_; }; 5/9
  • 6. Метод swap Можно использовать функцию std::swap и файла algorithm. #include <algorithm > struct IntArray { void swap(IntArray & a) { std:: swap(size_ , a.size_ ); std:: swap(data_ , a.data_ ); } ... private: size_t size_; int * data_; }; 6/9
  • 7. Реализация оператора = при помощи swap struct IntArray { IntArray(IntArray const& a) : size_(a.size_), data_(new int[size_ ]) { for (size_t i = 0; i != size_; ++i) data_[i] = a.data_[i]; } IntArray & operator =( IntArray const& a) { if (this != &a) IntArray(a). swap (* this ); return *this; } ... private: size_t size_; int * data_; }; 7/9
  • 8. Запрет копирования объектов Для того, чтобы запретить копирование, нужно объявить конструктор копирования и оператор присваивания как private и не определять их. struct IntArray { ... private: IntArray(IntArray const& a); IntArray & operator =( IntArray const& a); size_t size_; int * data_; }; 8/9
  • 9. Методы, генерируемые компилятором Компилятор генерирует четыре метода: 1. конструктор по умолчанию, 2. конструктор копирования, 3. оператор присваивания, 4. деструктор. Если потребовалось переопределить конструктор копирования, оператор присваивания или деструктор, то нужно переопределить и остальные методы из этого списка. 9/9