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

Lect13

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

Примерумногоуказателя

//Сначала управляемый класс 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

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