Lect13
.pdfНекорректнаяреализация
операцииприсваивания
class MyString { public:
MyString& operator =(MyString const& other) { delete [] m_pChars;
m_pChars = new char[other.m_length + 1]; memcpy(m_pChars, other.m_pChars,m_length + 1); m_length = other.m_length;
return *this;
}
…
private:
char * m_pChars; size_t m_length;
};
Некорректнаяработаоперациивслучае самоприсваивания:
MyString s("some string"); s = s;
31
Корректнаяреализация
присваиваниястрок
class MyString { public:
…
MyString& operator =(MyString const& other){ if (&other != this) {
MyString tmpCopy(other); std::swap(m_pChars, tmpCopy.m_pChars); std::swap(m_length, tmpCopy.m_length);
}
return *this;
}
32
Корректнаяреализация
присваиваниястрок
// сходным образом перегружаем операторы
MyString& operator +=(MyString const& other);
MyString& operator =(const char* pChars); MyString& operator +=(const char* pChars);
…
private:
char * m_pChars; size_t m_length;
};
33
Запретоперацииприсваивания
Врядеслучаеоперацияприсваивания объектовможетбытьнежелательной
◦Сэкземпляромобъектасвязываются какие-товнешниеобъекты,например, файловыйдескрипторилисетевое соединение
Операциюприсваиваниядляобъектов можнозапретить,объявивоператор присваиваниявприватнойобласти класса
◦ Реализациюможноприэтомнеписать |
34 |
Операцияиндексации
Являетсяунарнойоперацией,обычно использующейсядлядоступак элементамконтейнера
◦Вкачестветипаиндексаможет использоваться произвольный тип
Посколькудоступкэлементамможет бытькакначтение,такиназапись, существуютдвеформыданного оператора
35
Операцияиндексации
Формыперегрузки:
◦Операциядоступадлячтенияявляется константнойивозвращаетконстантуили константнуюссылкунаэлементконтейнера
◦Операциядоступадлязаписинеявляется константнойивозвращаетссылкунаэлемент контейнера
Программист можетперегрузитьданную операциюинымиспособами,однакоэто можетввести взаблуждениедругих программистов
36
Пример:посимвольнаяработасо
строкой
class MyString { public:
…
//индексированный доступ
//только для чтения const char operator[]
(unsigned index)const { assert(index < m_length); return m_pChars[index];
}
37
Пример:посимвольнаяработасо
строкой
// индексированный доступ для записи char & operator[](unsigned index) {
assert(index < m_length); return m_pChars[index];
}
…
private:
char * m_pChars; size_t m_length;
};
38
Перегрузкаопераций инкрементаидекремента
Длянекоторыхтиповданныхмогут бытьопределеныоперации инкрементаидекремента
◦Итераторы,счетчики
Операцииинкрементаидекремента являютсяунарными
Префиксныеипостфиксныеверсии данныхоперацийимеютразличную семантикуиперегружаютсяпоразному
39
Перегрузкапрефикснойформы инкрементаидекремента
Префикснаяоперациявыполняет модификациюобъектаивозвращает ссылку наизмененноезначениеобъекта
◦Возвращаетсяссылка,т.к.измененныйрезультат можетвдальнейшембытьмодифицирован,какв случаесоператором++длявстроенныхтипов данных:
++counter += n;
Синтаксиспрефикснойформыопераций:
◦Type& operator++()
◦Type& operator--()
40