Lect13
.pdfПримерумногоуказателя
//Сначала управляемый класс class MyClass {
public:
void DoSomethingImportant()
{
…
}
};
//Потом умный указатель class MyClassPtr {
…
}; |
51 |
Примерумногоуказателя
int main(int argc, char * argv[]) { MyClassPtr pMyClass(new MyClass()); if (…) {
pMyClass->DoSomethingImportant();
}
else { return 1;
//нет нужды в вызове delete
//(это сделает умный указатель)
}
return 0;
}
52
Стандартныеумныеуказатели
Библиотека STL содержит шаблонный класс auto_ptr, обеспечивающий политику владения объектом в динамической памяти
◦Недостаток:нельзя использовать в составе контейнеров STL (а такжево многих других контейнерах)
Библиотека boost предлагает шаблонные классы shared_ptr, scoped_ptr и intrusive_ptr,
предоставляющие различные способы владения и управления объектом
◦shared_ptr, например, основывается на подсчете
количества ссылок на объект и может |
|
использоваться в составе контейнеров STL |
53 |
|
Перегрузкаоперации приведениятипа
Иногдавозникаетнеобходимостьвыполнить приведение одногопользовательскоготипак другомупользовательскомуиливстроенномутипу данных.Например:
◦ПриведениеMyString кconst char*
◦ПриведениеСounterкunsigned int
◦ПриведениеCDateTimeкCTime
ЯзыкC++позволяетвтакихслучаяхобойтисьбез введениядополнительныхметодов,вроде
GetStringData(),GetTimer(),GetTime()припомощи операцийприведениятипа
СинтаксисоперацииприведенияктипуType:
◦operatorType()[const]
54
Примерприведениясчетчикак
unsigned int
class Counter { public:
operator unsigned int()const { return m_counter;
}
…
};
void f(unsigned value);
int main(int argc, char* argv[]){ Counter c(10);
f(c); |
// вызов приведения к unsigned int |
unsigned v = c; // аналогично |
|
return 0; |
|
} |
55 |
Примерприведениястрокового
объектакconst char *
class MyString { public:
operator const char*()const { return m_pChars;
}
…
};
void f(const char* s);
int main(int argc, char* argv[]) { MyString message("Hello, world!"); f(message); // приведениt к const char* return 0;
} |
56 |
Перегружаемосторожно!
Перегружатьоперацииприведения типовследуетосторожно,т.к.из-за неявногоприведениятиповиногда возможнынежелательные последствия
◦Неслучайновклассеstd::string вместо оператораприведенияк const char*, реализовали специальныйметодc_str()
57
Нежелательнаяперегрузка
операцийприведениятипов
#include <iostream>
class MyString { public:
MyString const operator+ (const char*)const;
operator const char*()const { return m_pChars;
}
…
};
58
Нежелательнаяперегрузка
операцийприведениятипов
int main(int argc, char* argv[]){ MyString msg("5432");
// допустим, что мы забыли заключить
//1 в кавычки для склейки строк std::cout << (msg + 1);
//фактически мы вызвали std::cout <<
//(static_cast<const char*>(msg) + 1);
//поэтому получим "432" вместо "54321" return 0;
}
59
Функторы
Функтор(илиобъектфункции, function object) – объект,длякоторого определенаоперация()
Преимуществафункторовперед обычнымифункциями
◦Наличиесостоянияуфунктора
◦Объектфункцииобладаетнекоторым типомиможетвыступатьвкачестве специализации шаблонов
◦Обычнофункторработаетбыстрее
указателя нафункцию |
60 |