C++ осень 2012 лекция 11
•
•
•
•
•
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
•
•
•
// пустой бесконечный цикл
for(;;);
// цикл с тождественно истинным условием
while(1) foo();
// постфиксный декремент, адресная арифметика и др.
while(*cp1++ = *cp2++);
•
•
•
•
•
•
•
•
•
operator = operator << operator >>
public private
std::pair<T1, T2>
boost::is_void<T>
std::vector<T>
•
•
•
•
•
class A;
A a; // вызов A::A(), если есть
// ...
A b(a); // вызов A::A(A&), если есть
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;
• operator []
• operator new
• operator delete
• operator ->
• operator double operator
char
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 – гл. обр. базовый тип
};
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();
•
•
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; // количество ссылок
};
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;
}
// class String
String(const char *s)
{ rep = new StringRep(s); }
int length() const // делегирование
{ return strlen(rep->_rep); }
private:
StringRep *rep; // общее представление
};
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);
}
// 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++;
}
// 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; // общее представление
};
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);
operator new operator
delete
•
•
•
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; };
};
String *String::_list = NULL;
void String::operator delete(void *p)
{
String *s = (String *)p;
s->_freeptr = _list;
_list = s;
}
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;
}
•
•
•
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);
}
// class Base
void Redefine(Base *pb)
{
if(!(--_rep->_refCount)) delete _rep;
_rep = pb;
}
protected:
Base(BaseConstructor) : _refCount(1) { }
private:
Base* _rep; // адрес экз. письма
int _refCount; // количество ссылок
};
class DerivedOne : public Base
{
public:
DerivedOne(T t) :
Base(BaseConstructor()), _refCount(1)
{ /* ... */ }
Base& operator+(const Base &b) { /* ... */ }
// ...
private:
// ...
};
•
•
•
• new
•
•
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); /* ... */
}
};
// выравнивание адреса 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);
}
};
•
•
•
•
•
•
•
•
•
•
•
•
• gets()
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
•
•
•
•
•
C++ осень 2012 лекция 11
•
•
•
•
•
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11

More Related Content

PDF
4.2 Перегрузка
PDF
Pyton – пробуем функциональный стиль
PDF
Hf labs education day. rocket science
PDF
5.1 Перегрузка операторов
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
PPT
Array Work C
PDF
Олег Алистратов — Сортировка списков в Perl и Python
PDF
Повышение конверсии через оптимизацию JS
4.2 Перегрузка
Pyton – пробуем функциональный стиль
Hf labs education day. rocket science
5.1 Перегрузка операторов
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Array Work C
Олег Алистратов — Сортировка списков в Perl и Python
Повышение конверсии через оптимизацию JS

What's hot (19)

PDF
Монады для барабанщиков. Антон Холомьёв
PDF
2.4 Использование указателей
PDF
DevConf. Дмитрий Сошников - ECMAScript 6
PDF
Красота и изящность стандартной библиотеки Python
PDF
Concepts lite
PDF
2.2 Стек вызовов
PDF
Недостатки Python
PDF
Паттерны и примеры структур данных в NoSQL на примере Tarantool
PPTX
разработка серверов и серверных приложений лекция №3
PDF
3.3 Конструкторы и деструкторы
PDF
Боремся со сложностью по-функциональному
PDF
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
PDF
2.8 Строки и ввод-вывод
PPT
08 set
PPT
основы программирования на языке C
PPTX
20110227 csseminar alvor_breslav
PDF
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Монады для барабанщиков. Антон Холомьёв
2.4 Использование указателей
DevConf. Дмитрий Сошников - ECMAScript 6
Красота и изящность стандартной библиотеки Python
Concepts lite
2.2 Стек вызовов
Недостатки Python
Паттерны и примеры структур данных в NoSQL на примере Tarantool
разработка серверов и серверных приложений лекция №3
3.3 Конструкторы и деструкторы
Боремся со сложностью по-функциональному
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
2.8 Строки и ввод-вывод
08 set
основы программирования на языке C
20110227 csseminar alvor_breslav
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Ad

Viewers also liked (19)

PPTX
Java весна 2013 лекция 9
PDF
C++ осень 2012 лекция 6
PDF
Тестирование весна 2013 лекция 4
PPTX
Информационная безопасность весна 2013 лекция 4
PPTX
СУБД осень 2012 вестник 2
PDF
Бизнес и системный анализ весна 2013 лекция 2
PPTX
АиСД осень 2012 лекция 8
PPT
Web осень 2012 лекция 10
PPTX
СУБД осень 2012 лекция 5
PPTX
АиСД осень 2012 лекция 3
PPT
Web осень 2012 лекция 5
PPT
Web весна 2012 лекция 10
PPT
Web весна 2012 лекция 3
PPT
Web осень 2012 лекция 2
PPTX
Управление продуктом весна 2014 лекция 1
PPT
Web осень 2012 лекция 9
PPTX
Java осень 2012 лекция 7
PDF
Безопасность интернет-приложений осень 2013 лекция 1
PPTX
Java весна 2013 лекция 1
Java весна 2013 лекция 9
C++ осень 2012 лекция 6
Тестирование весна 2013 лекция 4
Информационная безопасность весна 2013 лекция 4
СУБД осень 2012 вестник 2
Бизнес и системный анализ весна 2013 лекция 2
АиСД осень 2012 лекция 8
Web осень 2012 лекция 10
СУБД осень 2012 лекция 5
АиСД осень 2012 лекция 3
Web осень 2012 лекция 5
Web весна 2012 лекция 10
Web весна 2012 лекция 3
Web осень 2012 лекция 2
Управление продуктом весна 2014 лекция 1
Web осень 2012 лекция 9
Java осень 2012 лекция 7
Безопасность интернет-приложений осень 2013 лекция 1
Java весна 2013 лекция 1
Ad

Similar to C++ осень 2012 лекция 11 (20)

PDF
C++ осень 2012 лекция 9
PDF
C++ Базовый. Занятие 12.
PDF
Дмитрий Прокопцев — R-ссылки в С++11
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
PDF
PDF
PDF
PPT
PPT
PPTX
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
PDF
C++ осень 2013 лекция 4
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PPTX
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
PPTX
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PDF
C++ осень 2013 лекция 3
PDF
Конструктор копирования
PPTX
особенности программирования на с++
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
C++ осень 2012 лекция 9
C++ Базовый. Занятие 12.
Дмитрий Прокопцев — R-ссылки в С++11
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
C++ осень 2013 лекция 4
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Статический и динамический полиморфизм в C++, Дмитрий Леванов
C++ осень 2013 лекция 3
Конструктор копирования
особенности программирования на с++
Объектно-ориентированное программирование. Лекции 9 и 10

More from Technopark (20)

PDF
Лекция 11. Вычислительная модель Pregel
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 13. YARN
PDF
Лекция 12. Spark
PDF
Лекция 10. Apache Mahout
PDF
Лекция 9. ZooKeeper
PDF
Лекция 7. Введение в Pig и Hive
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 2. Основы Hadoop
PDF
Лекция 1. Введение в Big Data и MapReduce
PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PPT
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
PPTX
СУБД 2013 Лекция №9 "Безопасность баз данных"
PPTX
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
PPTX
СУБД 2013 Лекция №5 "Определение узких мест"
PPTX
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Лекция 11. Вычислительная модель Pregel
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 13. YARN
Лекция 12. Spark
Лекция 10. Apache Mahout
Лекция 9. ZooKeeper
Лекция 7. Введение в Pig и Hive
Лекция 6. MapReduce в Hadoop (графы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 4. MapReduce в Hadoop (введение)
Лекция 3. Распределённая файловая система HDFS
Лекция 2. Основы Hadoop
Лекция 1. Введение в Big Data и MapReduce
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...

C++ осень 2012 лекция 11

  • 5. • • • // пустой бесконечный цикл for(;;); // цикл с тождественно истинным условием while(1) foo(); // постфиксный декремент, адресная арифметика и др. while(*cp1++ = *cp2++);
  • 8. • • • • • class A; A a; // вызов A::A(), если есть // ... A b(a); // вызов A::A(A&), если есть
  • 9. 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;
  • 10. • operator [] • operator new • operator delete • operator -> • operator double operator char
  • 11. 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 – гл. обр. базовый тип };
  • 12. 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();
  • 14. 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; // количество ссылок };
  • 15. 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; }
  • 16. // class String String(const char *s) { rep = new StringRep(s); } int length() const // делегирование { return strlen(rep->_rep); } private: StringRep *rep; // общее представление };
  • 17. 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); }
  • 18. // 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++; }
  • 19. // 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; // общее представление };
  • 20. 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);
  • 22. 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; }; };
  • 23. String *String::_list = NULL; void String::operator delete(void *p) { String *s = (String *)p; s->_freeptr = _list; _list = s; }
  • 24. 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; }
  • 26. 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); }
  • 27. // class Base void Redefine(Base *pb) { if(!(--_rep->_refCount)) delete _rep; _rep = pb; } protected: Base(BaseConstructor) : _refCount(1) { } private: Base* _rep; // адрес экз. письма int _refCount; // количество ссылок };
  • 28. class DerivedOne : public Base { public: DerivedOne(T t) : Base(BaseConstructor()), _refCount(1) { /* ... */ } Base& operator+(const Base &b) { /* ... */ } // ... private: // ... };
  • 30. 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); /* ... */ } };
  • 31. // выравнивание адреса 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); } };