лекции программирование / polevoy_cpp_2012_spring_lecture_02
.pdfПрефиксные и постфиксные операторы (сигнатуры)
• префиксный оператор
T& operator++()
T& operator--()
• постфиксный оператор
T operator++(int)
T operator--(int)
18.02.2012 |
cppNewb.ru |
31 |
Префиксный унарный оператор (пример)
T&
T::operator++()
{
// содержательная работа
return *this;
}
18.02.2012 |
cppNewb.ru |
32 |
Постфиксный унарный оператор (пример)
T
T::operator++(int)
{
T initValue(*this)
++(*this);
return initValue;
}
18.02.2012 |
cppNewb.ru |
33 |
Бинарный оператор
• выражение aa @ bb
•нестатическая функция-член с одним аргументом
aa.operator@(bb)
• функция-не-член с двумя аргументами
operator@(aa, bb)
18.02.2012 |
cppNewb.ru |
34 |
Ограничения
•нельзя создать “новый” оператор
•нельзя изменить число аргументов
•нельзя изменить приоритет
18.02.2012 |
cppNewb.ru |
35 |
Предопределенный смысл
•должен сохраняться
•должен быть переопределен для всех вариантов операторов
пример:
a++
означает
a += 1
означает
a = a + 1
18.02.2012 |
cppNewb.ru |
36 |
Сохранение смысла
•для автономных версий операторов a@b всегда предоставляйте присваивающую версию @=
•для операторов, допускающих перестановку аргументов, предоставляйте все соответствующие версии
18.02.2012 |
cppNewb.ru |
37 |
Принцип минимальности интерфейса
•минимизируйте число функций, непосредственно манипулирующих представлением объекта
•объявляйте в классе только те операторы, которые модифицируют значение первого аргумента
18.02.2012 |
cppNewb.ru |
38 |
Минимальность интерфейса (пример)
• в классе
T& operator+=(const T& rhs)
• вне класса
T operator+(const T& lhs, const T& rhs)
{
T sum(lhs); sum += rhs; return sum;
}
18.02.2012 |
cppNewb.ru |
39 |
Перегрузка операторов (рекомендации)
•перегружайте умеренно и осмысленно
•используйте операторы для имитации привычной формы записи
•минимизируйте число функций, имеющих доступ к внутреннему представлению класса
•минимизируйте создание временных
объектов
18.02.2012 |
cppNewb.ru |
40 |