Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции программирование / polevoy_cpp_2012_spring_lecture_03

.pdf
Скачиваний:
25
Добавлен:
20.04.2015
Размер:
110.89 Кб
Скачать

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

T::T(const T&)

генерируется автоматически, если не определен пользователем

м.б. запрещен, определением в private

25.02.2012

cppNewb.ru

41

Конструктор копирования (пример)

String::String(const String& copy)

: m_pStr(new char[copy.size()])

, m_len(copy.len)

{

memcpy(m_pStr, copy.m_pStr, sizeof(*m_pStr) * size());

}

25.02.2012

cppNewb.ru

42

Оператор присваивания

T& T::operator=(const T&)

генерируется автоматически, если не определен пользователем

м.б. запрещен, определением в private

25.02.2012

cppNewb.ru

43

Схема присваивания (простая)

защита от присваивания самому себе

удаление старых элементов

создание и инициализация

(копирование) новых элементов

существует другая схема (безопасная при исключениях)

25.02.2012

cppNewb.ru

44

Оператор присваивания (пример)

T& T::operator=(const T& copy)

{

// защита от присваивания самому себе if (this != &copy)

{

// копирование

}

return *this;

}

25.02.2012

cppNewb.ru

45

Инициализация и присваивание

копирующий конструктор

инициализирует неинициализированную память

копирующее присваивание

должно обеспечивать правильную работу с уже созданными объектами

избегайте ошибок при попытке уменьшения объема кода

25.02.2012

cppNewb.ru

46

Ошибка генерации автоматического копирования

если нестатический член является

ссылкой

константой

определяемым пользователем типом, не

имеющим копирующего оператора присваивания

25.02.2012

cppNewb.ru

47

Структура (struct)

составной пользовательский тип

определяет набор (почти) произвольных типов

именованный доступ

25.02.2012

cppNewb.ru

48

POD типы

Plain Old Data

объекты можно копировать как фрагменты памяти

25.02.2012

cppNewb.ru

49

Пример структур

пример:

struct Address

{

char[256] m_name; unsigned int m_zip;

};

Adress companyAddress; //! не инициализирован

Adress myAddress = {“D.V. Polevoy”, 156987};

25.02.2012

cppNewb.ru

50