Лекция 4. Классы в C++. Конкретные классы (часть 2). Артур Садеков
Встроенные функции class Date { • • public: inline int get_day() const; //. . . private: • int day, month, year; }; Спецификатор inline Компилятор пытается генерировать в месте вызова код, соответсвующие inlineфункции небольшие по размеру и часто используемые функции inline int Date: : get_day() const class Date { { public: return day; int get_day() const {return day; } } //… } Nortel Networks Confidential
Копирование объектов По умолчанию – почленное копирование. void h () { Stack s 1(1000); Stack s 2 = s 1; Stack s 3(10000); s 3 = s 2; } Возможные проблемы: • Утечка памяти • Многократный вызов деструктора - попытка освобождения одних и тех же ресурсов Копирующая инициализация - проблема Копирующее присваивание - проблема Nortel Networks Confidential
Копирование объектов. Копирующий конструктор. class Stack { public: //. . . Stack(const Stack& rs); // копирующий конструктор Stack& operator= (const Stack& rs); // коп. присваивание } Stack: : Stack(const Stack& rs) : max_size(rs. max_size), top(rs. top) { storage = new char[max_size]; for(int i=0; i
Копирование объектов. Копирующее присваивание. Stack& Stack: : operator= (const Stack& rs) { if (&rs != this) { delete[] storage; storage = new char[max_size=rs. max_size]; top = rs. top; for(int i=0; i
Копирование объектов. Итог. • • Копирующий конструктор инициализирует чистую память. Оператор присваивания работает с созданным объектом. Стратегия: – защита от присваивания самому себе, – удаление старых элементов, – инициализация и копирование новых элементов, – возврат ссылки на себя. Nortel Networks Confidential
Объекты-члены. Инициализация Class Schedule { Schedule: : Schedule(Date dt 1, Stack& s) public: : m_date(dt 1), m_stack(s) Schedule(Date dt 1, { Stack& s); Schedule(Date dt 1); m_stack. push(/*. . . */); } //. . . Schedule: : Schedule(Date dt 1) private: Date : m_date(dt 1), m_stack() m_date; Stack m_stack; } { } Schedule: : Schedule(Date dt 1, Stack& s) : m_date(dt 1) { m_stack = s; Nortel Networks Confidential }
Объекты-члены. Копирование. Class Schedule { public: Schedule& operator=(const Schedule &sch); //. . . private: Date m_date; Stack m_stack; } Schedule& Schedule: : operator=(const Schedule &sch) { m_date = sch. m_date; m_stack = sch. m_stack; } Nortel Networks Confidential
Необходимая инициализация членов. Class Schedule { Schedule: : Schedule(int ii, Date& dd, public: Time tt) Schedule(int ii, Date& dd, Time : m_i(ii), m_rd(dd), m_t(tt) { } tt); //… private: const int m_i; Date& m_rd; Time m_t; } Nortel Networks Confidential Инициализация в конструкторе обязательна для: • членов без конструкторов по умолчанию, • константных членов, • членов, являющихся ссылками.
Эффективные типы, определяемые пользователем • • Конструктор/деструктор набор функций доступа – селекторов (const) набор функций модификаторов набор операций для копирования объектов Nortel Networks Confidential
Конец Nortel Networks Confidential