Download - C++ осень 2012 лекция 11
![Page 1: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/1.jpg)
![Page 2: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/2.jpg)
•
•
•
•
•
![Page 3: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/3.jpg)
![Page 4: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/4.jpg)
![Page 5: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/5.jpg)
•
•
•
// пустой бесконечный цикл
for(;;);
// цикл с тождественно истинным условием
while(1) foo();
// постфиксный декремент, адресная арифметика и др.
while(*cp1++ = *cp2++);
![Page 6: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/6.jpg)
•
•
•
•
•
•
•
•
•operator = operator << operator >>
![Page 7: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/7.jpg)
public private
std::pair<T1, T2>
boost::is_void<T>
std::vector<T>
![Page 8: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/8.jpg)
•
•
•
•
•
class A;
A a; // вызов A::A(), если есть
// ...
A b(a); // вызов A::A(A&), если есть
![Page 9: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/9.jpg)
this
class A;
A *pa = new A(42); // вызов A::A(int)
A *pa2 = new A[N]; // вызов A::A(), N раз
// ...
// освобождение памяти с вызовом A::~A()
delete [] pa2;
// освобождение памяти без вызова A::~A()
// delete pa2;
![Page 10: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/10.jpg)
• operator []
• operator new
• operator delete
• operator ->
• operator double operator
char
![Page 11: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/11.jpg)
class ARef // фиктивный класс
{
public:
ARef(A &a, int i) : _a(a), _ix(i) { }
ARef& operator= (T t) { /* запись t в _a */
return *this;
}
operator T() { /* чтение из _a в _t */
return _t;
}
private:
A& _a; // ссылка на агрегат
int _ix; // индекс в агрегате
T _t; // T – гл. обр. базовый тип
};
![Page 12: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/12.jpg)
class A // агрегат
{
friend class ARef; // для повышения производит.
public:
A() { /* ... */ }
ARef operator[] (int ix) {
return ARef(*this, ix);
}
};
// в точке использования
A a; int i, j; T t;
// ...
a[i] = t; // (a.operator[](i)).operator=(t);
t = a[j]; // t = (a.operator[](j)).operator T();
![Page 13: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/13.jpg)
•
•
![Page 14: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/14.jpg)
class StringRep // класс-представление
{
friend class String;
private:
StringRep(const char *s) : _count(1) {
strcpy(_rep = new char[strlen(s) + 1],
s);
}
~StringRep() { delete [] _rep; }
private:
char* _rep; // общее представление
int _count; // количество ссылок
};
![Page 15: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/15.jpg)
class String // класс-строка
{
public:
String() { rep = new StringRep(“”); }
String(const String& s)
{ rep = s.rep; rep->_count++; }
String& operator=(const String& s) {
s.rep->_count++;
if(--rep->_count <= 0) delete rep;
rep = s.rep; return *this;
}
~String() {
if(--rep->_count <= 0) delete rep;
}
![Page 16: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/16.jpg)
// class String
String(const char *s)
{ rep = new StringRep(s); }
int length() const // делегирование
{ return strlen(rep->_rep); }
private:
StringRep *rep; // общее представление
};
![Page 17: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/17.jpg)
class StringRep // класс-представление
{
friend class String;
private:
StringRep() { *(_rep = new char[1]) = „\0‟; }
StringRep(const StringRep& s) {
strcpy(_rep = new char[
strlen(s._rep) + 1],
s._rep);
}
StringRep(const char *s) {
strcpy(_rep = new char[strlen(s) + 1],
s);
}
![Page 18: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/18.jpg)
// class StringRep
~StringRep() { delete [] _rep; }
int length() const { return strlen(_rep); }
private:
char* _rep; // общее представление
int _count; // количество указателей
};
class String // класс-строка
{
public:
String() {(p = new StringRep())->_count = 1;}
String(const String& s) {
(p = s.p)->_count++;
}
![Page 19: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/19.jpg)
// class String
String(const char *s) {
(p = new StringRep(s))->_count = 1;
}
StringRep* operator->() const { return p; }
String& operator=(const String& q) {
if(--p->_count <= 0 && p != q.p)
delete p;
(p = q.p)->_count++;
return *this;
}
~String() { if(--p->_count <= 0) delete p; }
private:
StringRep *p; // общее представление
};
![Page 20: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/20.jpg)
void* operator new(std::size_t size);
void operator delete(void* ptr);
// для «размещающего» new: T *pt = new (buf) T(val);
void* operator new(std::size_t, void* p);
![Page 21: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/21.jpg)
operator new operator
delete
•
•
•
![Page 22: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/22.jpg)
class String
{
public:
String() { /* _rep = ... */ }
String(const char *s) { /* _rep = ... */ }
~String() { delete[] _rep; }
void* operator new(std::size_t);
void operator delete(void*);
private:
static String *_list; // список своб. блоков
// указатель на следующий блок
// или представление строки
union { String *_freeptr; char *_rep; };
};
![Page 23: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/23.jpg)
String *String::_list = NULL;
void String::operator delete(void *p)
{
String *s = (String *)p;
s->_freeptr = _list;
_list = s;
}
![Page 24: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/24.jpg)
void* String::operator new(std::size_t /* size */)
{
if(!_list) {
int i = 0;
for(_list = (String*)new char
[POOL_SIZE * sizeof(String)];
i < POOL_SIZE - 1; i++)
_list[i]->_freeptr =
&(_list[i + 1]);
_list[i]->_freeptr = NULL;
}
String *aList = _list;_list = _list->_freeptr;
return aList;
}
![Page 25: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/25.jpg)
•
•
•
![Page 26: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/26.jpg)
struct BaseConstructor{BaseConstructor(int = 0){}};
class Base // класс-конверт
{
public:
Base() { _rep = new DerivedOne; }
Base(T t) { _rep = new DerivedOne(t); }
Base(T t,U u) { _rep = new DerivedTwo(t,u); }
Base(Base &b) { /* ... */ }
Base& operator=(Base &b) { /* ... */ }
virtual Base& operator+(const Base &b) {
return _rep->operator+(b);
}
![Page 27: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/27.jpg)
// class Base
void Redefine(Base *pb)
{
if(!(--_rep->_refCount)) delete _rep;
_rep = pb;
}
protected:
Base(BaseConstructor) : _refCount(1) { }
private:
Base* _rep; // адрес экз. письма
int _refCount; // количество ссылок
};
![Page 28: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/28.jpg)
class DerivedOne : public Base
{
public:
DerivedOne(T t) :
Base(BaseConstructor()), _refCount(1)
{ /* ... */ }
Base& operator+(const Base &b) { /* ... */ }
// ...
private:
// ...
};
![Page 29: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/29.jpg)
•
•
•
• new
•
•
![Page 30: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/30.jpg)
class Base;
inline void *operator new(std::size_t, Base *b)
{ return b; }
unsigned char buf[BUF_SIZE], *pbuf = &buf;
class Base // класс, «создаваемый» пользователем
{
public:
void *operator new(std::size_t)
{ return (void*) pbuf; }
Base() { /* ПУСТО */ }
Base(T t) { /* ... */
(void) new(this) Derived(t); /* ... */
}
};
![Page 31: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/31.jpg)
// выравнивание адреса a на границу в b байт
inline int round(int a, int b)
{ return ((a + b – 1) / b) * b; }
class Derived : public Base
{
private:
Derived(T t) : Base()
{
// ...
// выравнивание на границу DWORD
pbuf += round(sizeof(Derived), 0x04);
}
};
![Page 32: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/32.jpg)
•
•
•
•
•
•
•
•
![Page 33: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/33.jpg)
•
•
•
•
• gets()
•
•
•
![Page 34: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/34.jpg)
•
•
•
•
![Page 35: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/35.jpg)
•
•
•
•
•
•
•
•
•
![Page 36: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/36.jpg)
•
•
•
•
•
•
•
•
![Page 37: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/37.jpg)
•
•
•
•
•
•
•
![Page 38: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/38.jpg)
•
•
•
•
•
•
•
![Page 39: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/39.jpg)
•
•
•
•
•
•
•
•
![Page 40: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/40.jpg)
•
•
•
•
•
•
•
•
![Page 41: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/41.jpg)
•
•
•
•
•
•
•
![Page 42: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/42.jpg)
•
•
•
•
•
•
•
![Page 43: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/43.jpg)
•
•
•
•
•
![Page 44: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/44.jpg)
•
•
•
•
•
![Page 45: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/45.jpg)
•
•
![Page 46: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/46.jpg)
•
•
![Page 47: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/47.jpg)
![Page 48: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/48.jpg)
![Page 49: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/49.jpg)
![Page 50: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/50.jpg)
![Page 51: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/51.jpg)
![Page 52: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/52.jpg)
•
•
•
•
•
![Page 53: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/53.jpg)
![Page 54: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/54.jpg)
•
•
•
•
•
![Page 55: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/55.jpg)
![Page 56: C++ осень 2012 лекция 11](https://reader031.vdocuments.pub/reader031/viewer/2022020101/55a4c45c1a28abf3028b470a/html5/thumbnails/56.jpg)