лекции программирование / polevoy_cpp_2012_spring_lecture_03
.pdfКонструктор копирования
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 != ©)
{
// копирование
}
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 |