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

Lect13

.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
1.67 Mб
Скачать

Некорректнаяреализация

операцииприсваивания

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]