🗊 ПРОГРАММИРОВАНИЕ II Емельянов Павел Геннадьевич к.ф.-м.н., с.н.с. ИСИ СО РАН emelianov@iis.nsk.su

Категория: Информатика
Нажмите для полного просмотра!
  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №1  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №2  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №3  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №4  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №5  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №6  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №7  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №8  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №9  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №10  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №11  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №12  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №13  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №14  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №15  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №16  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №17  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №18  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №19  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №20  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №21  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №22  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №23  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №24  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №25  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №26  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №27  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №28  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №29  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №30  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №31  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №32  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №33  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №34  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №35  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №36  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №37  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №38  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №39  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №40  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №41  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №42  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №43  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №44  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №45  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №46  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №47  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №48  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №49  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №50  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №51  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №52  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №53  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №54  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №55  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №56  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №57  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №58  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №59  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №60  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №61  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №62  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №63  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №64  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №65  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №66  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №67  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №68  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №69  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №70  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №71  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №72  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №73  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №74  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №75  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №76  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №77  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №78  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №79  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №80  
  ПРОГРАММИРОВАНИЕ II  Емельянов Павел Геннадьевич  к.ф.-м.н., с.н.с. ИСИ СО РАН  emelianov@iis.nsk.su   , слайд №81

Содержание

Вы можете ознакомиться и скачать ПРОГРАММИРОВАНИЕ II Емельянов Павел Геннадьевич к.ф.-м.н., с.н.с. ИСИ СО РАН emelianov@iis.nsk.su . Презентация содержит 81 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





ПРОГРАММИРОВАНИЕ II
Емельянов Павел Геннадьевич
к.ф.-м.н., с.н.с. ИСИ СО РАН
emelianov@iis.nsk.su
Описание слайда:
ПРОГРАММИРОВАНИЕ II Емельянов Павел Геннадьевич к.ф.-м.н., с.н.с. ИСИ СО РАН emelianov@iis.nsk.su

Слайд 2





Общий план курса
Объектно-ориентированное программирование (на примере основных концепций языка C++)
Объектно-ориентированное проектирование.
Модели данных и базы данных (на примере XML и реляционных МД и БД)
Организация взаимодействия между компьютером и человеком (на примере программных графических интерфейсов в среде Windows)
Описание слайда:
Общий план курса Объектно-ориентированное программирование (на примере основных концепций языка C++) Объектно-ориентированное проектирование. Модели данных и базы данных (на примере XML и реляционных МД и БД) Организация взаимодействия между компьютером и человеком (на примере программных графических интерфейсов в среде Windows)

Слайд 3





Часть I. Основы языка С++
Концепция класса. Видимость членов. Конструкторы/деструкторы.
Статические члены и методы.
Перегрузка имен. Переопределение операторов.
Друзья класса.
Области видимости и пространства имен.
 Исключения.
Шаблоны.
Наследование.
STL.
Описание слайда:
Часть I. Основы языка С++ Концепция класса. Видимость членов. Конструкторы/деструкторы. Статические члены и методы. Перегрузка имен. Переопределение операторов. Друзья класса. Области видимости и пространства имен. Исключения. Шаблоны. Наследование. STL.

Слайд 4





Литература
Б. Страуструп. Язык программирования С++. Третье издание: Пер. с англ. – М: М: ДМК Пресс; СПб: Питер, 1999. 991 с.
Б. Страуструп. Дизайн и эволюция С++. Пер. с англ. – М: ДМК Пресс; СПб: Питер, 2006. 448 с.
Н. Джосьютис. C++ Стандартная библиотека. Для профессионалов. Пер. с англ. – СПб: Питер, 2004. 730с.
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, Второе издание: Пер. с англ. – М: Бином, 1999. 560 с. 
Курсы Интернет университета информационных технологий. http://www.intuit.ru/.
Описание слайда:
Литература Б. Страуструп. Язык программирования С++. Третье издание: Пер. с англ. – М: М: ДМК Пресс; СПб: Питер, 1999. 991 с. Б. Страуструп. Дизайн и эволюция С++. Пер. с англ. – М: ДМК Пресс; СПб: Питер, 2006. 448 с. Н. Джосьютис. C++ Стандартная библиотека. Для профессионалов. Пер. с англ. – СПб: Питер, 2004. 730с. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, Второе издание: Пер. с англ. – М: Бином, 1999. 560 с. Курсы Интернет университета информационных технологий. http://www.intuit.ru/.

Слайд 5





Программа на С
#include "myStack.h"
void init_stack(Stack* st, int size) {
  st->sp=0;
  st->sz=size;
  st->bf=(int*)malloc(size*sizeof(int));
}
void deinit_stack(Stack* st) {
  free(st->bf);
}
int empty(Stack* st) {
  return st->sp==0;
}
void push(Stack* st,int x) {
  if (st->sp==st->sz) {
    printf("error: stack overflow");
    return;
  }
  st->bf[st->sp++]=x;
}
int pop(Stack* st) {
  if (empty(st)) {
    printf("error: stack underflow");
    return 0;
  }
  return st->bf[--st->sp];
}
Описание слайда:
Программа на С #include "myStack.h" void init_stack(Stack* st, int size) { st->sp=0; st->sz=size; st->bf=(int*)malloc(size*sizeof(int)); } void deinit_stack(Stack* st) { free(st->bf); } int empty(Stack* st) { return st->sp==0; } void push(Stack* st,int x) { if (st->sp==st->sz) { printf("error: stack overflow"); return; } st->bf[st->sp++]=x; } int pop(Stack* st) { if (empty(st)) { printf("error: stack underflow"); return 0; } return st->bf[--st->sp]; }

Слайд 6





Задачи, которые хотелось бы решить при создании нового языка
Удобное моделирование математических концепций (в С пользовательские типы не ведут себя как стандартные, конструирование новых типов из существующих, ...).
Повышение надежности создаваемых программных систем (в С слаб даже статический типовой контроль, неудобные средства обработки исключительных ситуаций, ...).
Разработка больших программных систем (использование старого кода, переиспользование существующих программных компонент, ...).
Описание слайда:
Задачи, которые хотелось бы решить при создании нового языка Удобное моделирование математических концепций (в С пользовательские типы не ведут себя как стандартные, конструирование новых типов из существующих, ...). Повышение надежности создаваемых программных систем (в С слаб даже статический типовой контроль, неудобные средства обработки исключительных ситуаций, ...). Разработка больших программных систем (использование старого кода, переиспользование существующих программных компонент, ...).

Слайд 7





Краткая история С++
Язык С – 1970 год (действующий ISO стандарт – 1990 год). 
Начало 80-х – С с классами.
Simula 67, Clu, Smalltalk,  Ada, Algol 68, Modula-2, ML.
Первая версия языка С++ – 1983 год (действующий ISO стандарт – 1998 год). Managed Extensions for C++ –> Ecma C++/CLI.
Описание слайда:
Краткая история С++ Язык С – 1970 год (действующий ISO стандарт – 1990 год). Начало 80-х – С с классами. Simula 67, Clu, Smalltalk, Ada, Algol 68, Modula-2, ML. Первая версия языка С++ – 1983 год (действующий ISO стандарт – 1998 год). Managed Extensions for C++ –> Ecma C++/CLI.

Слайд 8





Что является С и не является С++
Отсутствие типа поразумевает int.
Устаревшее описание параметров функций и процедур.
В С++ появились новые ключевые слова.
Макросы С – ключевые слова С++. 
В С возможен goto в обход инициализации.
В С в инициализаторе массива может быть больше элементов: 
                      char a[3]=“abc”;
Описание слайда:
Что является С и не является С++ Отсутствие типа поразумевает int. Устаревшее описание параметров функций и процедур. В С++ появились новые ключевые слова. Макросы С – ключевые слова С++. В С возможен goto в обход инициализации. В С в инициализаторе массива может быть больше элементов: char a[3]=“abc”;

Слайд 9





Новые возможности С++
Константы, инициализаторы в операторах, новое в приведении типов, параметры по умолчанию, операторы распределения динамической памяти. 
Концепция класса, контроль доступа, виды хранения,  конструкторы/деструкторы.
Производные классы. Виртуальность/абстрактные классы.
Перегрузка операторов.
Шаблоны. Стандартная библиотека.
Обработка исключений.
Доступ к типовой информации во время исполнения.
Описание слайда:
Новые возможности С++ Константы, инициализаторы в операторах, новое в приведении типов, параметры по умолчанию, операторы распределения динамической памяти. Концепция класса, контроль доступа, виды хранения, конструкторы/деструкторы. Производные классы. Виртуальность/абстрактные классы. Перегрузка операторов. Шаблоны. Стандартная библиотека. Обработка исключений. Доступ к типовой информации во время исполнения.

Слайд 10





Логический тип bool
int  x=0;
bool b = x==1;//значения типа bool: true/false
int  y=int(b);//у имеет значение 0
x=int(y == 0);//x имеет значение 1
b=123;        //b имеет значение true
Описание слайда:
Логический тип bool int x=0; bool b = x==1;//значения типа bool: true/false int y=int(b);//у имеет значение 0 x=int(y == 0);//x имеет значение 1 b=123; //b имеет значение true

Слайд 11





Константы
#define  PI  3.14159      //стиль С
const float PI = 3.14159;
const int v[]={1,2,3};    //массив констант
void f(const int* n)
{
	*n=123;   //ошибка: менять *n нельзя
}
…
int x;      //переменная
…
f(&x);      //гарантируется, что значение не  			//изменится
…
Описание слайда:
Константы #define PI 3.14159 //стиль С const float PI = 3.14159; const int v[]={1,2,3}; //массив констант void f(const int* n) { *n=123; //ошибка: менять *n нельзя } … int x; //переменная … f(&x); //гарантируется, что значение не //изменится …

Слайд 12





Указатели и константы
void Proc(char * p, const char * q)
{
	char s[]=“abc”;
	const char * pc=s;         //указатель на константу
	pc[1]=‘z’;                 //ошибка
	pc=p;
	char * const cp=s;         //константный указатель
	cp[1]=‘z’;
	cp=p;                      //ошибка
	const char * const cpc=s;  //константный указатель на 			   		   //константу
	cpc[1]=‘z’;                //ошибка
	cpc=p;                     //ошибка
   *q=‘z’;                   //ошибка: нельзя изменить *q
}
Описание слайда:
Указатели и константы void Proc(char * p, const char * q) { char s[]=“abc”; const char * pc=s; //указатель на константу pc[1]=‘z’; //ошибка pc=p; char * const cp=s; //константный указатель cp[1]=‘z’; cp=p; //ошибка const char * const cpc=s; //константный указатель на //константу cpc[1]=‘z’; //ошибка cpc=p; //ошибка *q=‘z’; //ошибка: нельзя изменить *q }

Слайд 13





Ссылки: пример из Паскаля
procedure Inc(var x:integer)
begin
	x:=x+1;
end;
…
Inc(y);
…
Описание слайда:
Ссылки: пример из Паскаля procedure Inc(var x:integer) begin x:=x+1; end; … Inc(y); …

Слайд 14





Ссылки в С++
//что можно в С
void Inc(int* x)
{
	*x++;
}
…
Inc(&y);
…
Описание слайда:
Ссылки в С++ //что можно в С void Inc(int* x) { *x++; } … Inc(&y); …

Слайд 15





Концепция класса
class Complex {
	double re;
	double im;
};
Описание слайда:
Концепция класса class Complex { double re; double im; };

Слайд 16





Классы и объекты: реализация стека
class Stack {
	int   sz;
	int   sp;
	int*  bf;
public:
 //объединяет варианты Stack() и Stack(int)
	Stack(int=100);    
	~Stack() { delete[] bf; }
	bool empty() const { 
		return this->sp==0; 
	}
void push(const int x) { 
		bf[sp++]=x; 
	}
int pop();
}; 
inline Stack::Stack(int size) {
	sp=0;
	bf=new int[sz=size];
}
inline int Stack::pop() {
	 return this->bf[--this->sp];
}
Описание слайда:
Классы и объекты: реализация стека class Stack { int sz; int sp; int* bf; public: //объединяет варианты Stack() и Stack(int) Stack(int=100); ~Stack() { delete[] bf; } bool empty() const { return this->sp==0; } void push(const int x) { bf[sp++]=x; } int pop(); }; inline Stack::Stack(int size) { sp=0; bf=new int[sz=size]; } inline int Stack::pop() { return this->bf[--this->sp]; }

Слайд 17





Конструирование объектов – I
Описание слайда:
Конструирование объектов – I

Слайд 18





Конструирование объектов – II
Описание слайда:
Конструирование объектов – II

Слайд 19





Конструирование объектов – III
Создание нестатического объекта, являющегося членом класса:

class newClass { 
	Stack  stk;
	int    num; 
public:      
    newClass(int n=20) : stk(n), num(n) { stk.push(num); }
} 
Создание временного объекта при вычислении выражения:

class Complex {
	double re;
	double im;
public:
	Complex(double r=0.0, double i=0.0) : re(r), im(i) {}
	Complex operator+(Complex x) { return Complex(re+x.re,im+x.im); }
};
…
Complex  a(1,2),  b(2,1),  c=a+b+Complex(1,1);
…
Описание слайда:
Конструирование объектов – III Создание нестатического объекта, являющегося членом класса: class newClass { Stack stk; int num; public: newClass(int n=20) : stk(n), num(n) { stk.push(num); } } Создание временного объекта при вычислении выражения: class Complex { double re; double im; public: Complex(double r=0.0, double i=0.0) : re(r), im(i) {} Complex operator+(Complex x) { return Complex(re+x.re,im+x.im); } }; … Complex a(1,2), b(2,1), c=a+b+Complex(1,1); …

Слайд 20





Конструктор по умолчанию
Конструктор без аргументов называется конструктором по умолчанию. 
Конструктор, для всех аргументов которого заданы умолчательные значения, является конструктором по умолчанию.
Если конструктор по умолчанию не задан для класса явно, то он сгенерируется компилятором автоматически и будет вызываться неявно всякий раз, когда это требуется. При этом для членов классов будут вызываться конструкторы по умолчанию.
Класс, содержащий в качестве членов константы и ссылки, обязан содержать определение конструктора по умолчанию:

class SomeClass {
	const int  val;
	int&       ref;
public:
	 SomeClass(int v=100, int& r) : val(v), ref(r) {}
…
}
Описание слайда:
Конструктор по умолчанию Конструктор без аргументов называется конструктором по умолчанию. Конструктор, для всех аргументов которого заданы умолчательные значения, является конструктором по умолчанию. Если конструктор по умолчанию не задан для класса явно, то он сгенерируется компилятором автоматически и будет вызываться неявно всякий раз, когда это требуется. При этом для членов классов будут вызываться конструкторы по умолчанию. Класс, содержащий в качестве членов константы и ссылки, обязан содержать определение конструктора по умолчанию: class SomeClass { const int val; int& ref; public: SomeClass(int v=100, int& r) : val(v), ref(r) {} … }

Слайд 21





Копирующий конструктор
Описание слайда:
Копирующий конструктор

Слайд 22





“Плохой” копирующий конструктор
Описание слайда:
“Плохой” копирующий конструктор

Слайд 23





Уничтожение объектов
Деструктор вызывается:
	– для автоматических объектов – когда управление выходит из блока, где они описаны;
	– для статических объектов  - когда программа
«завершает свое исполнение»;
в порядке,  обратном вызову конструкторов.
Обычно деструктор вызывается неявно. Явный вызов деструктора 
		T* po=new T(); po->~T();
	встречается редко (например, переопределение оператора delete).
Описание слайда:
Уничтожение объектов Деструктор вызывается: – для автоматических объектов – когда управление выходит из блока, где они описаны; – для статических объектов - когда программа «завершает свое исполнение»; в порядке, обратном вызову конструкторов. Обычно деструктор вызывается неявно. Явный вызов деструктора T* po=new T(); po->~T(); встречается редко (например, переопределение оператора delete).

Слайд 24





Статические члены и методы класса
class AAA {
	static const int BOUND=100;//статич. константа интегрального типа
   static int       count;
   int              val; 	
public:
   AAA(int n=1) : val(n) { ++count; }
   ~AAA() { --count; }
   void proc() {
      if (count>BOUND) val*=2; //имеется доступ ко всем членам
   }
   static int func() {
      val++;        //ошибка: доступ к нестатическому члену 
      return count; //правильно: статический метод имеет доступ
                    //           только к статическим членам
   }	
}
…
int AAA::count=0;
…
AAA x;  x.proc();
if (AAA::func()>1000) 
cout<<“too many objects!”;
Описание слайда:
Статические члены и методы класса class AAA { static const int BOUND=100;//статич. константа интегрального типа static int count; int val; public: AAA(int n=1) : val(n) { ++count; } ~AAA() { --count; } void proc() { if (count>BOUND) val*=2; //имеется доступ ко всем членам } static int func() { val++; //ошибка: доступ к нестатическому члену return count; //правильно: статический метод имеет доступ // только к статическим членам } } … int AAA::count=0; … AAA x; x.proc(); if (AAA::func()>1000) cout<<“too many objects!”;

Слайд 25





Объявление mutable
логическое и физическое постоянство
class SomeClass {
		 char *cache;
		 …
public:
	SomeClass() : cache(0) { /*инициализация других членов*/ }
	~SomeClass() {
	   delete[] cache; 		 
	   /*деинициализация других членов*/ 
	}
	…
	char* toString() const {
	   if (! cache) {  //создать строковое представление объекта
	      SomeClass* thisObject=const_cast<SomeClass*>(this);
	      thisObject->cache=new char[100];		
	      …	
	   }	
	   return cache;
	}
}
const SomeClass constObject;  
… constObject.toString() …         //проблема!!!
Описание слайда:
Объявление mutable логическое и физическое постоянство class SomeClass { char *cache; … public: SomeClass() : cache(0) { /*инициализация других членов*/ } ~SomeClass() { delete[] cache; /*деинициализация других членов*/ } … char* toString() const { if (! cache) { //создать строковое представление объекта SomeClass* thisObject=const_cast<SomeClass*>(this); thisObject->cache=new char[100]; … } return cache; } } const SomeClass constObject; … constObject.toString() … //проблема!!!

Слайд 26





Перегрузка имен функций – I
int abs(int);                       int    abs(int);
long labs(long);                    long   abs(long); 
double fabs(double);                double abs(double);
void print(int);             void print(long);
void print(float);           void print(double);
void print(char);            void print(char*);
…
	print(1);    //ошибка: print(int) или print(long) или
                //        print(float) или print(double)? 
	print(1.0);  //ошибка: print(float) или print(double)?
Явное приведение параметров, определяющее выбор:
print(int(1));
print(long(1));  //print(1L); print(static_cast<long>(1));
Описание слайда:
Перегрузка имен функций – I int abs(int); int abs(int); long labs(long); long abs(long); double fabs(double); double abs(double); void print(int); void print(long); void print(float); void print(double); void print(char); void print(char*); … print(1); //ошибка: print(int) или print(long) или // print(float) или print(double)? print(1.0); //ошибка: print(float) или print(double)? Явное приведение параметров, определяющее выбор: print(int(1)); print(long(1)); //print(1L); print(static_cast<long>(1));

Слайд 27





Перегрузка имен функций – II
Описание слайда:
Перегрузка имен функций – II

Слайд 28





Перегрузка имен функций – III
Соответствие, достигаемое за счет продвижения в «охватывающие» типы:
bool, (signed/unsigned) char, short -> int
float -> double, double -> long double.
Соответствие, достигаемое за счет преобразований:
int -> double, double -> int, int -> unsigned int
произвольный указатель -> void*
указатели на производные типы -> указатели на их базовые типы.
Соответствие, достигаемое за счет преобразований, определяемых пользователем.
Соответствие за счет (...) в объявлении функции.
Описание слайда:
Перегрузка имен функций – III Соответствие, достигаемое за счет продвижения в «охватывающие» типы: bool, (signed/unsigned) char, short -> int float -> double, double -> long double. Соответствие, достигаемое за счет преобразований: int -> double, double -> int, int -> unsigned int произвольный указатель -> void* указатели на производные типы -> указатели на их базовые типы. Соответствие, достигаемое за счет преобразований, определяемых пользователем. Соответствие за счет (...) в объявлении функции.

Слайд 29





Перегрузка имен функций – IV
Результат разрешения перегрузки не зависит от порядка объявления функций.
Тип возвращаемого значения не используется при разрешении перегрузки.
Случай нескольких аргументов:
int pow(int,int);
double pow(double,double);
…
double d=pow(2.0,2);   //pow(int(2.0),2) или pow(2.0,double(2))?

Правило: вызывается функция, у которой наилучшим образом соответствует один аргумент и лучшим либо таким же остальные аргументы. Иначе – ошибка (неоднозначность).
Описание слайда:
Перегрузка имен функций – IV Результат разрешения перегрузки не зависит от порядка объявления функций. Тип возвращаемого значения не используется при разрешении перегрузки. Случай нескольких аргументов: int pow(int,int); double pow(double,double); … double d=pow(2.0,2); //pow(int(2.0),2) или pow(2.0,double(2))? Правило: вызывается функция, у которой наилучшим образом соответствует один аргумент и лучшим либо таким же остальные аргументы. Иначе – ошибка (неоднозначность).

Слайд 30





Переопределение операторов – I
class Complex {
	double re;
	double im;
public:
	Complex(double r=0.0, double i=0.0) : re(r), im(i) {}
	Complex operator+(Complex x) { 
		return Complex(re+x.re,im+x.im); 
	}
	Complex operator*(Complex x);
};
…
Complex Complex::operator*(Complex x) { 
	return Complex(…,…); 
}
…
Complex  a(1,2),  b(2,1),  c=a+Complex(0,1)*b; //приоритет операций обычный
…
			a+b   сокращение для   a.operator+(b)
Описание слайда:
Переопределение операторов – I class Complex { double re; double im; public: Complex(double r=0.0, double i=0.0) : re(r), im(i) {} Complex operator+(Complex x) { return Complex(re+x.re,im+x.im); } Complex operator*(Complex x); }; … Complex Complex::operator*(Complex x) { return Complex(…,…); } … Complex a(1,2), b(2,1), c=a+Complex(0,1)*b; //приоритет операций обычный … a+b сокращение для a.operator+(b)

Слайд 31





Переопределение операторов – II
	+      -      *      /      %      ^      &    
	|      ~      !      =      <      >      +=   
	-=     *=     /=     %=     ^=     &=     |=   
	<<     >>     >>=    <<=    ==     !=     <=   
	>=     &&     ||     ++     --     ->*    ,    
	->     []     ()     new    delete new[]  delete[] 
Нельзя переопределить:
разрешение области видимости – ::
выбор члена – .
выбор члена через указатель на член – .*
тернарный условный оператор – ?:
Нельзя ввести новую лексему для оператора или изменить 
его местность.
Предопределенный (для объектов) смысл операторов =, &
и , можно скрыть, сделав их закрытыми.
Описание слайда:
Переопределение операторов – II + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete new[] delete[] Нельзя переопределить: разрешение области видимости – :: выбор члена – . выбор члена через указатель на член – .* тернарный условный оператор – ?: Нельзя ввести новую лексему для оператора или изменить его местность. Предопределенный (для объектов) смысл операторов =, & и , можно скрыть, сделав их закрытыми.

Слайд 32





Переопределение операторов – III
Бинарные операторы могут определяться:
Либо в виде нестатической функции-члена с одним аргументом:
class X {
	…
public:
	X(int);
	void operator+(int);
	…
}
Либо в виде функции-не-члена с двумя аргументами:
	void operator+(X,X);
за исключением операторов  =,  [],  ->, чтобы гарантировать, что первый аргумент изменяемое значение:
	operator=(operator[](1,X),123); //!!! 
Eсли определены обе операторные функции, то для выбора
применяются правила разрешения перегрузки:
	X a;		
	a+1;		//a.operator+(1);
	1+a;		//operator+(X(1),a);
Если выбор неоднозначен, то выдается ошибка.
Описание слайда:
Переопределение операторов – III Бинарные операторы могут определяться: Либо в виде нестатической функции-члена с одним аргументом: class X { … public: X(int); void operator+(int); … } Либо в виде функции-не-члена с двумя аргументами: void operator+(X,X); за исключением операторов =, [], ->, чтобы гарантировать, что первый аргумент изменяемое значение: operator=(operator[](1,X),123); //!!! Eсли определены обе операторные функции, то для выбора применяются правила разрешения перегрузки: X a; a+1; //a.operator+(1); 1+a; //operator+(X(1),a); Если выбор неоднозначен, то выдается ошибка.

Слайд 33





Переопределение операторов – IV
Унарные операторы могут определяться:
Либо в виде нестатической функции-члена :
class X {
	…
public:
  void operator~();       //без аргументов
  void operator++();      //без аргументов - префиксный
  void operator++(int);   //с одним фиктивным аргументом - постфиксный
	…
}
Либо в виде функции-не-члена:
		void operator~(X);      //с одним аргументом
	void operator++(X);     //с одним аргументом – префиксный
	void operator++(X,int); //с двумя аргументами - постфиксный
Eсли определены обе операторные функции, то для выбора
применяются правила разрешения перегрузки. Если выбор
неоднозначен, то выдается ошибка.
enum Day {sun,mon,tue,wed,thu,fri,sat};
Day& operator++(Day& d) {
	return d=(d==sat)?sun:Day(d+1);
}
Описание слайда:
Переопределение операторов – IV Унарные операторы могут определяться: Либо в виде нестатической функции-члена : class X { … public: void operator~(); //без аргументов void operator++(); //без аргументов - префиксный void operator++(int); //с одним фиктивным аргументом - постфиксный … } Либо в виде функции-не-члена: void operator~(X); //с одним аргументом void operator++(X); //с одним аргументом – префиксный void operator++(X,int); //с двумя аргументами - постфиксный Eсли определены обе операторные функции, то для выбора применяются правила разрешения перегрузки. Если выбор неоднозначен, то выдается ошибка. enum Day {sun,mon,tue,wed,thu,fri,sat}; Day& operator++(Day& d) { return d=(d==sat)?sun:Day(d+1); }

Слайд 34





Оператор присваивания
ВАЖНО: В отличии от копирующего конструктора
оператор присваивания работает с уже существующим
объектом: 
class Stack{
	int   sp;
	int   sz;
int*  bf;
public:
	…
	Stack& operator=(const Stack& stk) {
		//this->bf уже указывает на какой-то буфер. после
		//присваивания по умолчанию связь со старым буфером
		//могла бы потеряться. надо сделать что-то умное 
    …
	}
}
Описание слайда:
Оператор присваивания ВАЖНО: В отличии от копирующего конструктора оператор присваивания работает с уже существующим объектом: class Stack{ int sp; int sz; int* bf; public: … Stack& operator=(const Stack& stk) { //this->bf уже указывает на какой-то буфер. после //присваивания по умолчанию связь со старым буфером //могла бы потеряться. надо сделать что-то умное … } }

Слайд 35





“Плохой” оператор присваивания
Описание слайда:
“Плохой” оператор присваивания

Слайд 36





Стандартные потоки ввода/вывода
class istream {
…
} cin;
class ostream {
	…
} cout, cerr;
istream& operator>>(istream&, int);
ostream& operator<<(ostream&, int);
#include <iostream>
…
int n;
cin >> n;
cout << n+1 << endl;
…
istream& operator>> ( istream& inputStream, Date& date ) { 
	inputStream >> date.Month >> date.Day >> date.Year; 
return inputStream; 
}
Описание слайда:
Стандартные потоки ввода/вывода class istream { … } cin; class ostream { … } cout, cerr; istream& operator>>(istream&, int); ostream& operator<<(ostream&, int); #include <iostream> … int n; cin >> n; cout << n+1 << endl; … istream& operator>> ( istream& inputStream, Date& date ) { inputStream >> date.Month >> date.Day >> date.Year; return inputStream; }

Слайд 37





Переопределение операторов – V
class Complex {
	double re, im;
public:
	Complex(double r=0.0,double i=0.0) : re(r), im(i) {}
	double real() const { return re; }
	double imag() const { return im; }
	Complex& operator+=(Complex c) { 	
		re+=c.re; im+=c.im; 
		return *this;
	}
	Complex& operator+=(double r) { 	
		re+=r; 
		return *this;
	}
}
//функции помощники для реализации смешанной арифметики
Complex operator+(Complex a, Complex b) { 	
	Complex c=a; 
	return  c+=b;
}
Complex  operator+ (Complex, double);
Complex  operator+ (double, Complex);
Complex  operator+ (Complex);		//унарный плюс
Complex  operator- (Complex);		//унарный минус
bool     operator==(Complex, Complex);
bool     operator!=(Complex, Complex);
istream& operator>>(istream&, complex&);
ostream& operator>>(ostream&, complex&);
Описание слайда:
Переопределение операторов – V class Complex { double re, im; public: Complex(double r=0.0,double i=0.0) : re(r), im(i) {} double real() const { return re; } double imag() const { return im; } Complex& operator+=(Complex c) { re+=c.re; im+=c.im; return *this; } Complex& operator+=(double r) { re+=r; return *this; } } //функции помощники для реализации смешанной арифметики Complex operator+(Complex a, Complex b) { Complex c=a; return c+=b; } Complex operator+ (Complex, double); Complex operator+ (double, Complex); Complex operator+ (Complex); //унарный плюс Complex operator- (Complex); //унарный минус bool operator==(Complex, Complex); bool operator!=(Complex, Complex); istream& operator>>(istream&, complex&); ostream& operator>>(ostream&, complex&);

Слайд 38





Z=M*X+Y и эффективность 
«Типичный» код в типичной программе по линейной алгебре:
	… while (…) {… Z=M*X+Y; …} …
где X, Y, Z – векторы и M – матрица.
При прямолинейной реализации создаются две временные переменные и осуществляются два копирования.
Очень неэффективно.
Широко распространенная операция:
The GNU Multiple Precision Arithmetic Library
void mpz_addmul(mpz_t rop,mpz_t op1,mpz_t op2) //rop←rop+op1×op2
Операции вида rop←rop+op1×op2 стандартизованы в IEEE Standard for Floating-Point Arithmetic (IEEE 754) 2008 года.
Анонсировано FMA расширение SSE компаниями Intel и AMD (2011г.).
Описание слайда:
Z=M*X+Y и эффективность «Типичный» код в типичной программе по линейной алгебре: … while (…) {… Z=M*X+Y; …} … где X, Y, Z – векторы и M – матрица. При прямолинейной реализации создаются две временные переменные и осуществляются два копирования. Очень неэффективно. Широко распространенная операция: The GNU Multiple Precision Arithmetic Library void mpz_addmul(mpz_t rop,mpz_t op1,mpz_t op2) //rop←rop+op1×op2 Операции вида rop←rop+op1×op2 стандартизованы в IEEE Standard for Floating-Point Arithmetic (IEEE 754) 2008 года. Анонсировано FMA расширение SSE компаниями Intel и AMD (2011г.).

Слайд 39





Z=M*X+Y и отложенные вычисления – I
void mul_add_and_assign(Vector&, const Matrix&, 
                        const Vector&, const Vector& );
struct MVmul {
	const Matrix& m; const Vector& v;
	MVmul(const Matrix& mm, const Vector& vv) : m(mm), v(vv) {}
	operator Vector();  //
};
inline MVmul operator*(const Matrix& mm, const Vector& vv) {
	return MVmul(mm,vv);
}
struct MVmulVadd {
	const Matrix& m; const Vector& v; const Vector& v2;
	MVmulVadd(const Matrix& mv, const Vector& vv)
					: m(mv.m), v(mv.v), v2(vv){}
	operator Vector();
};
inline MVmulVadd operator+(const MVmul& mv, const Vector& vv) {
	return MVmulVadd(mm,vv);
}
Описание слайда:
Z=M*X+Y и отложенные вычисления – I void mul_add_and_assign(Vector&, const Matrix&, const Vector&, const Vector& ); struct MVmul { const Matrix& m; const Vector& v; MVmul(const Matrix& mm, const Vector& vv) : m(mm), v(vv) {} operator Vector(); // }; inline MVmul operator*(const Matrix& mm, const Vector& vv) { return MVmul(mm,vv); } struct MVmulVadd { const Matrix& m; const Vector& v; const Vector& v2; MVmulVadd(const Matrix& mv, const Vector& vv) : m(mv.m), v(mv.v), v2(vv){} operator Vector(); }; inline MVmulVadd operator+(const MVmul& mv, const Vector& vv) { return MVmulVadd(mm,vv); }

Слайд 40





Z=M*X+Y и отложенные вычисления – II
class Vector {
	//
public:
	//
	Vector(const MVmulVadd& mvv) {
	mul_add_and_assign(this,&mvv.m,&mvv.v,&mvv.v2);
}
	Vector& operator=(const MVmulVadd& mvv) {
	mul_add_and_assign(this,&mvv.m,&mvv.v,&mvv.v2);
		return *this;
}
};
…
Matrix M;
Vector X,Y,Z;
…
Z=M*X+Y;
…
			Z.operator=(MVmulVadd(MVmul(M,X),Y));
				mul_add_and_assign(&Z,&M,&X,&Y);
Описание слайда:
Z=M*X+Y и отложенные вычисления – II class Vector { // public: // Vector(const MVmulVadd& mvv) { mul_add_and_assign(this,&mvv.m,&mvv.v,&mvv.v2); } Vector& operator=(const MVmulVadd& mvv) { mul_add_and_assign(this,&mvv.m,&mvv.v,&mvv.v2); return *this; } }; … Matrix M; Vector X,Y,Z; … Z=M*X+Y; … Z.operator=(MVmulVadd(MVmul(M,X),Y)); mul_add_and_assign(&Z,&M,&X,&Y);

Слайд 41





Друзья класса – I
Нестатическая функция-член обладает следующими
свойствами:
доступ к закрытой части класса;
находится в области видимости класса;
вызывается для объекта класса.
Статическая функция-член обладает только первыми двумя
свойствами.
Объявление функции-члена как friend наделяет ее только
первым свойством. Задачи, решаемые в данном случае:
– разделить различные классы объектов;
– предоставить эффективные средства доступа к внутреннему
   устройству классов, являющихся логически связанными.
Описание слайда:
Друзья класса – I Нестатическая функция-член обладает следующими свойствами: доступ к закрытой части класса; находится в области видимости класса; вызывается для объекта класса. Статическая функция-член обладает только первыми двумя свойствами. Объявление функции-члена как friend наделяет ее только первым свойством. Задачи, решаемые в данном случае: – разделить различные классы объектов; – предоставить эффективные средства доступа к внутреннему устройству классов, являющихся логически связанными.

Слайд 42





Друзья класса – II
class Matrix;
class Vector {
	int length;
	…
public:
…
	friend Vector operator*(const Matrix&, const Vector&);
	…
}
class Matrix {
	int numRows, numColumns;
	…
	friend Vector operator*(const Matrix&, const Vector&);
public:
	…
}
Vector operator*(const Matrix& m, const Vector& v) {
	if (m.numColumns!=v.length)
		//несоответствие размерностей. что-то надо сделать
	…
}
Описание слайда:
Друзья класса – II class Matrix; class Vector { int length; … public: … friend Vector operator*(const Matrix&, const Vector&); … } class Matrix { int numRows, numColumns; … friend Vector operator*(const Matrix&, const Vector&); public: … } Vector operator*(const Matrix& m, const Vector& v) { if (m.numColumns!=v.length) //несоответствие размерностей. что-то надо сделать … }

Слайд 43





Друзья класса – III
Друзей можно объявлять как в private-, так и в 
	public-части описания класса.
Отношение «дружбы» не является транзитивным.
Можно объявить весь класс другом:
	class A {
	friend class B;
		int count;
		…
	public:
		…
	};
	class B {
		…
	public:
		B(const A& a) { 
			if (a.count>0) /*что-то сделать*/
			… 
		}
Описание слайда:
Друзья класса – III Друзей можно объявлять как в private-, так и в public-части описания класса. Отношение «дружбы» не является транзитивным. Можно объявить весь класс другом: class A { friend class B; int count; … public: … }; class B { … public: B(const A& a) { if (a.count>0) /*что-то сделать*/ … }

Слайд 44





Области видимости и пространства имен
Глобальная ОВ (на уровне всей программы).
Локальная ОВ (внутри блока).
ОВ класса.
ОВ пространства имен.
	namespace UsefulThings {
		class Stack;
		class Queue {
		  …
		  Queue(const Stack& s) { /* использовать s */ }
		  …
		};
		…
	}
   …
	class UsefulThings::Stack {
		…
	};
	…
	UsefulThings::Queue* qе=new UsefulThings::Queue();
Описание слайда:
Области видимости и пространства имен Глобальная ОВ (на уровне всей программы). Локальная ОВ (внутри блока). ОВ класса. ОВ пространства имен. namespace UsefulThings { class Stack; class Queue { … Queue(const Stack& s) { /* использовать s */ } … }; … } … class UsefulThings::Stack { … }; … UsefulThings::Queue* qе=new UsefulThings::Queue();

Слайд 45





Пространства имен – I
Синонимы пространства имен:
		
		namespace UT=UsefulThings;
		…
		UT::Stack sp=UT::Stack(128);
«Глобализация» всех описаний из пространства имен:
		
		using namespace UsefulThings;
		…
		Stack sp=Stack(10);
«Глобализация» одного описания из пространства имен:
		
		using namespace UsefulThings::Stack;
		…
		Stack sp=Stack(10); //правильно
 	Queue qe;           //ошибка: требуется квалификатор
				     //        пространства имен
Описание слайда:
Пространства имен – I Синонимы пространства имен: namespace UT=UsefulThings; … UT::Stack sp=UT::Stack(128); «Глобализация» всех описаний из пространства имен: using namespace UsefulThings; … Stack sp=Stack(10); «Глобализация» одного описания из пространства имен: using namespace UsefulThings::Stack; … Stack sp=Stack(10); //правильно Queue qe; //ошибка: требуется квалификатор // пространства имен

Слайд 46





Пространства имен – II
Разрешение области видимости:
	namespace ZZZ { int Var; }
	int Var;
	void main() {
		using namespace ZZZ;
		Var++;       //ошибка: глобальная или из ПИ ZZZ
		::Var++;     //правильно: глобальная
		ZZZ::Var++;  //правильно: из пространства имен ZZZ
	}
Вложенные пространства имен:
	namespace X { namespace Y { int Var; } }
	… X::Y::Var++; … 
Пространства имен являются открытыми:
	namespace ZZZ { int AAA; }
	…
	namespace ZZZ { int BBB; }
Описание слайда:
Пространства имен – II Разрешение области видимости: namespace ZZZ { int Var; } int Var; void main() { using namespace ZZZ; Var++; //ошибка: глобальная или из ПИ ZZZ ::Var++; //правильно: глобальная ZZZ::Var++; //правильно: из пространства имен ZZZ } Вложенные пространства имен: namespace X { namespace Y { int Var; } } … X::Y::Var++; … Пространства имен являются открытыми: namespace ZZZ { int AAA; } … namespace ZZZ { int BBB; }

Слайд 47





Пространства имен – III
Неименованные пространства имен:
	namespace { int Var; } //определение
	…  Var++; … //находится в той же единице трансляции, что и определение
Стандартное пространство имен:
	//файл stdio.h
	namespace std {
		…
		int printf(char* fmt, ...);
		…
	}
	using namespace std;
	//файл myProg.c
	#include <stdio.h>
	…
	printf(“Hello!”);
	…
Описание слайда:
Пространства имен – III Неименованные пространства имен: namespace { int Var; } //определение … Var++; … //находится в той же единице трансляции, что и определение Стандартное пространство имен: //файл stdio.h namespace std { … int printf(char* fmt, ...); … } using namespace std; //файл myProg.c #include <stdio.h> … printf(“Hello!”); …

Слайд 48





Исключения – I
При возникновении ошибок, которые невозможно
обработать в месте их возникновения, нужно:
сгенерировать информацию об ошибке;
перехватить эту информацию в том месте, где это важно;
обработать эту ошибку или передать дальше в случае невозможности восстановить корректный ход вычислений.
Традиционный подход, основанный на «длинных»
переходах или проверке системных переменных
errno/error/…, оказывается неадекватным для
систематического использования.
Описание слайда:
Исключения – I При возникновении ошибок, которые невозможно обработать в месте их возникновения, нужно: сгенерировать информацию об ошибке; перехватить эту информацию в том месте, где это важно; обработать эту ошибку или передать дальше в случае невозможности восстановить корректный ход вычислений. Традиционный подход, основанный на «длинных» переходах или проверке системных переменных errno/error/…, оказывается неадекватным для систематического использования.

Слайд 49





Исключения – II
class Stack {
	…
public:
	class Overflow {
		int limit;
	public:
		Overflow(int n=0) : limit(n) {}
		char* Message() { return /*выдать информацию о допустимом размере*/; } 
	}
	…
	bool empty() throw() { return sp==0; }
	void push(int x) throw(Overflow) {
		if (sp==sz) 
		    throw Overflow(sz); 
		bf[sp++]=x;          //если ошибка, то std::unexpected  
	}
}
…
try {
	stk.push(123);
}
catch (Stack::Overflow& err) {
	cout<<err.Message()<<endl;
}
…
Описание слайда:
Исключения – II class Stack { … public: class Overflow { int limit; public: Overflow(int n=0) : limit(n) {} char* Message() { return /*выдать информацию о допустимом размере*/; } } … bool empty() throw() { return sp==0; } void push(int x) throw(Overflow) { if (sp==sz) throw Overflow(sz); bf[sp++]=x; //если ошибка, то std::unexpected } } … try { stk.push(123); } catch (Stack::Overflow& err) { cout<<err.Message()<<endl; } …

Слайд 50





Исключения – III
try {
	throw E();
}
catch (H) {
	//управление окажется здесь, если:
	//1. H того же типа, что и E.
	//2. H является однозначной открытой базой E.
	//3. H и E являются указателями, и пункт 1 или 2 
	//   выполняется для типов, на которые они ссылаются.
	//4. H является ссылкой, и пункт 1 или 2 выполняется 
	//   для типа, на который он ссылается.
}
try {
	//действия
}
catch (...) {
	//управление окажется здесь в случае любого 
	//«С++»-исключения
}
Описание слайда:
Исключения – III try { throw E(); } catch (H) { //управление окажется здесь, если: //1. H того же типа, что и E. //2. H является однозначной открытой базой E. //3. H и E являются указателями, и пункт 1 или 2 // выполняется для типов, на которые они ссылаются. //4. H является ссылкой, и пункт 1 или 2 выполняется // для типа, на который он ссылается. } try { //действия } catch (...) { //управление окажется здесь в случае любого //«С++»-исключения }

Слайд 51





Исключения – IV
Повторная генерация исключения
	try {
	   throw E();
	}
	catch (...) {
	   if (...)
		 //внештатная ситуация может быть полностью обработана
	   else
	     throw; //то же самое исключение генерируется повторно
	            //и передается выше 
}
Порядок обработки исключений
	try {
		//возможны исключения
	}
	catch (ExceptionType1) 
		//
	catch (ExceptionType2) 
		//
	… 
	catch (...)
		//все остальные исключения
Описание слайда:
Исключения – IV Повторная генерация исключения try { throw E(); } catch (...) { if (...) //внештатная ситуация может быть полностью обработана else throw; //то же самое исключение генерируется повторно //и передается выше } Порядок обработки исключений try { //возможны исключения } catch (ExceptionType1) // catch (ExceptionType2) // … catch (...) //все остальные исключения

Слайд 52





Исключения – V
Техника обратных вызовов (callback techniques)
#include “LexicalAnalyser.h”
namespace LA=LexicalAnalyser;
…
while (true)
	try {
		LA::Lexer(inputStream); //чтение и разбор входного потока
	}
	catch (LA::Number& number) {
		//обработать число
	}
	catch (LA::Keyword& keyword) {
		//обработать ключевое слово
	}
	catch (LA::Name& name) {
		//обработать имя
	}
	catch (LA::Error& err) {
		//обработать известную лексическую ошибку/прервать разбор
	}
	catch (LA::EndOfInput& eof) {
		//достигнут конец входного потока
	}
	catch (...) {
		//неизвестная ошибка
	}
Описание слайда:
Исключения – V Техника обратных вызовов (callback techniques) #include “LexicalAnalyser.h” namespace LA=LexicalAnalyser; … while (true) try { LA::Lexer(inputStream); //чтение и разбор входного потока } catch (LA::Number& number) { //обработать число } catch (LA::Keyword& keyword) { //обработать ключевое слово } catch (LA::Name& name) { //обработать имя } catch (LA::Error& err) { //обработать известную лексическую ошибку/прервать разбор } catch (LA::EndOfInput& eof) { //достигнут конец входного потока } catch (...) { //неизвестная ошибка }

Слайд 53





Сортировка в стандартной C-библиотеке
Описание слайда:
Сортировка в стандартной C-библиотеке

Слайд 54





Шаблоны – I
Процедурное программирование: один раз пишем – используем многократно; в качестве параметров выступают конкретные значения, типы которых зафиксированы при разработке.
Обобщенное программирование: один раз пишем – используем многократно; в качестве параметров выступают типы (и некоторые другие объекты языка). После настройки типа (выполняется автоматически компилятором) все как обычно.
Идеи из языка Ada: generic types and packages – обобщенные/родовые типы и пакеты.
Описание слайда:
Шаблоны – I Процедурное программирование: один раз пишем – используем многократно; в качестве параметров выступают конкретные значения, типы которых зафиксированы при разработке. Обобщенное программирование: один раз пишем – используем многократно; в качестве параметров выступают типы (и некоторые другие объекты языка). После настройки типа (выполняется автоматически компилятором) все как обычно. Идеи из языка Ada: generic types and packages – обобщенные/родовые типы и пакеты.

Слайд 55





Шаблоны – II
template<class T>void qsort(T a[], int p, int r) { 
   if (p < r) {  
	   T x=a[r], t;
      int i=p-1; 
      for (int j=p; j<r; ++j) {  
         if (a[j]<=x) {   
            i++;   
            t=a[i]; a[i]=a[j]; a[j]=t;
         } 
      } 
      t=a[i+1]; a[i+1]=a[r]; a[r]=t;
      int q=i+1;
      qsort<T>(a, p, q-1);  
      qsort<T>(a, q+1, r); 
   }
}
template<class T>void QuickSort(T a[], int sz) {
   qsort<T>(a, 0, sz-1);
}
void main() {
   int  arr[]={2,243,5,6,76,8,67,1,43,2}; 
   QuickSort<int>(arr,10);
}
Описание слайда:
Шаблоны – II template<class T>void qsort(T a[], int p, int r) { if (p < r) { T x=a[r], t; int i=p-1; for (int j=p; j<r; ++j) { if (a[j]<=x) { i++; t=a[i]; a[i]=a[j]; a[j]=t; } } t=a[i+1]; a[i+1]=a[r]; a[r]=t; int q=i+1; qsort<T>(a, p, q-1); qsort<T>(a, q+1, r); } } template<class T>void QuickSort(T a[], int sz) { qsort<T>(a, 0, sz-1); } void main() { int arr[]={2,243,5,6,76,8,67,1,43,2}; QuickSort<int>(arr,10); }

Слайд 56





Шаблоны – III
Описание слайда:
Шаблоны – III

Слайд 57





Шаблоны – IV
template<class Type> class Stack {
	int    sz;
	int    sp;
	Type  *bf;
public:
	Stack(int=100);
	~Stack() {
		delete [] bf;
	}
	bool empty() const { 
		return sp==0; 
	}
	void push(const Type& x) { 
	  bf[sp++]=x; 
	}
	Type pop();
};
template<class Type> 
inline Stack<Type>::Stack(int size) {
	sp=0;
	bf=new Type[sz=size];
}
template<class Type> 
inline Type Stack<Type>::pop() {
	return bf[--sp];
}
Описание слайда:
Шаблоны – IV template<class Type> class Stack { int sz; int sp; Type *bf; public: Stack(int=100); ~Stack() { delete [] bf; } bool empty() const { return sp==0; } void push(const Type& x) { bf[sp++]=x; } Type pop(); }; template<class Type> inline Stack<Type>::Stack(int size) { sp=0; bf=new Type[sz=size]; } template<class Type> inline Type Stack<Type>::pop() { return bf[--sp]; }

Слайд 58





Template-реализация стека
Описание слайда:
Template-реализация стека

Слайд 59





Наследование в ООП – I
class SomeClass{
	int val;
public:
	SomeClass(int x) : val(x) {}
operator int() const { return val; }
};
template<class T1,class T2> void proc(Stack<T1>& s1,Stack<T2>& s2)
{
	while (!s1.empty())
		s2.push(T2(s1.pop()));
}
void main() 
{
	Buff_Stack<int> st1;
	List_Stack<SomeClass> st2;
	List_Stack<int> st3;
//заполнить st1
	proc(st1,st2);
	proc(st2,st3);
}
Описание слайда:
Наследование в ООП – I class SomeClass{ int val; public: SomeClass(int x) : val(x) {} operator int() const { return val; } }; template<class T1,class T2> void proc(Stack<T1>& s1,Stack<T2>& s2) { while (!s1.empty()) s2.push(T2(s1.pop())); } void main() { Buff_Stack<int> st1; List_Stack<SomeClass> st2; List_Stack<int> st3; //заполнить st1 proc(st1,st2); proc(st2,st3); }

Слайд 60





Наследование в ООП – II
#include <list>
namespace UsefulThings {
template<class Type> class Stack {
public:
	class Stack_Overflow {};
	class Stack_Underflow {};
	virtual bool empty() const throw()=0; 
	virtual void push(const Type& x)
                throw(Stack_Overflow)=0;
	virtual Type pop()
                throw(Stack_Underflow)=0;
   //Stack& operator=(const Stack& stk);
}; 
template<class Type> 
class Buff_Stack : public Stack<Type> {
	int   sz, sp;
	Type  *bf;
public:
	Buff_Stack(int size=100); 
	…
}
Описание слайда:
Наследование в ООП – II #include <list> namespace UsefulThings { template<class Type> class Stack { public: class Stack_Overflow {}; class Stack_Underflow {}; virtual bool empty() const throw()=0; virtual void push(const Type& x) throw(Stack_Overflow)=0; virtual Type pop() throw(Stack_Underflow)=0; //Stack& operator=(const Stack& stk); }; template<class Type> class Buff_Stack : public Stack<Type> { int sz, sp; Type *bf; public: Buff_Stack(int size=100); … }

Слайд 61





Наследование в ООП – III
Жизнь до ист.мат. Совмещение типов в C
Описание слайда:
Наследование в ООП – III Жизнь до ист.мат. Совмещение типов в C

Слайд 62





Наследование в ООП – III
Еще одна попытка
Описание слайда:
Наследование в ООП – III Еще одна попытка

Слайд 63





Наследование в ООП – IV
Класс, обеспечивающий интерфейс для множества других
классов, называется полиморфным типом.
class Shape {
   Point center;                           class Circle: public Shape {
	Color color;                               int radius;
protected:                                 public:
	Color bordercolor;                         Circle(Color c) :
public:                                              Shape(c), radius(0) {} 
Shape(Color c) : color(c) {}               void draw() { 
Point where() {                               //... 
   return center;                          } 
}                                          void rotate(int) {}
	virtual void draw()=0;                     void drawborder() { 
virtual void rotate(int angle)=0;            bordercolor=new Color(…); 
void move(Point position) {                  Shape::drawborder();
   center=position;                        }
   draw();                              };
   } 
   virtual void drawborder()               void RotateAll(Shape* figs,int n,int a){
   {/*...использование bordercolor...*/}       for(int i=0; i<n; ++i) 
};                                                      figs[i]->rotate(10);
                                                 }
Описание слайда:
Наследование в ООП – IV Класс, обеспечивающий интерфейс для множества других классов, называется полиморфным типом. class Shape { Point center; class Circle: public Shape { Color color; int radius; protected: public: Color bordercolor; Circle(Color c) : public: Shape(c), radius(0) {} Shape(Color c) : color(c) {} void draw() { Point where() { //... return center; } } void rotate(int) {} virtual void draw()=0; void drawborder() { virtual void rotate(int angle)=0; bordercolor=new Color(…); void move(Point position) { Shape::drawborder(); center=position; } draw(); }; } virtual void drawborder() void RotateAll(Shape* figs,int n,int a){ {/*...использование bordercolor...*/} for(int i=0; i<n; ++i) }; figs[i]->rotate(10); }

Слайд 64





Наследование в ООП – V
Реализация
Описание слайда:
Наследование в ООП – V Реализация

Слайд 65





Наследование – VI
class Person {
	char name[100];
	Date birthday;
	int  department;
};
class Manager : public Person {
	list<Person*> staff;
	Date          appointment;
public:
	int           level;
};
Описание слайда:
Наследование – VI class Person { char name[100]; Date birthday; int department; }; class Manager : public Person { list<Person*> staff; Date appointment; public: int level; };

Слайд 66





Преобразования типов
static_cast          
	int x=static_cast<int>(1.0);
reinterpret_cast  
	int* x=reinterpret_cast<int*>(0xEEEE);
dynamic_cast
   void proc(Base* pb) {                        //pb не нулевой
     Derived* pd=dynamic_cast<Derived*>(pb);
     if (!pd)
        //pb не указывает на объект типа Derived или имеет 
        //в качестве базовых классов более одного типа Derived 
        …
  }
const_cast
    SomeClass* thisObject=const_cast<SomeClass*>(this);
Конструкторы как преобразователи типов.
Операторы-преобразователи типов.
Описание слайда:
Преобразования типов static_cast int x=static_cast<int>(1.0); reinterpret_cast int* x=reinterpret_cast<int*>(0xEEEE); dynamic_cast void proc(Base* pb) { //pb не нулевой Derived* pd=dynamic_cast<Derived*>(pb); if (!pd) //pb не указывает на объект типа Derived или имеет //в качестве базовых классов более одного типа Derived … } const_cast SomeClass* thisObject=const_cast<SomeClass*>(this); Конструкторы как преобразователи типов. Операторы-преобразователи типов.

Слайд 67





Обзор STL
string (строки); 
типы vector, list, deque, queue, stack, map, multimap, set, multiset, bitset;
memory (распределение памяти);
iterator (стандартные механизмы доступа)
algorithm (стандартные алгоритмы: сортировка, перестановка, мин/макс, …)
stdexcept (стандартные исключения)
locale (информация о культурных особенностях)
Описание слайда:
Обзор STL string (строки); типы vector, list, deque, queue, stack, map, multimap, set, multiset, bitset; memory (распределение памяти); iterator (стандартные механизмы доступа) algorithm (стандартные алгоритмы: сортировка, перестановка, мин/макс, …) stdexcept (стандартные исключения) locale (информация о культурных особенностях)

Слайд 68





Стек, предоставляемый STL
template<class Ty, class Container = deque<_Ty>> class stack {
	Container c;	
public:
	typedef _Container container_type;
	typedef typename Container::value_type value_type;
	typedef typename Container::size_type size_type;
	typedef typename Container::reference reference;
	typedef typename Container::const_reference const_reference;
	stack() : c() {}
	explicit stack(const _Container& _Cont) : c(_Cont) {}
	bool empty() const { return (c.empty()); }
	size_type size() const { return (c.size()); }
	reference top() { return (c.back()); }
	const_reference top() const { return (c.back()); }
	void push(const value_type& _Val) { c.push_back(_Val); }
	void pop() { c.pop_back(); }
};		
template<class _Ty, class _Container> inline bool operator==
  					(const stack<_Ty, Container>& Left, 
				 	 const stack<_Ty, Container>& Right) {
	return (_Left.c == _Right.c);
}
Описание слайда:
Стек, предоставляемый STL template<class Ty, class Container = deque<_Ty>> class stack { Container c; public: typedef _Container container_type; typedef typename Container::value_type value_type; typedef typename Container::size_type size_type; typedef typename Container::reference reference; typedef typename Container::const_reference const_reference; stack() : c() {} explicit stack(const _Container& _Cont) : c(_Cont) {} bool empty() const { return (c.empty()); } size_type size() const { return (c.size()); } reference top() { return (c.back()); } const_reference top() const { return (c.back()); } void push(const value_type& _Val) { c.push_back(_Val); } void pop() { c.pop_back(); } }; template<class _Ty, class _Container> inline bool operator== (const stack<_Ty, Container>& Left, const stack<_Ty, Container>& Right) { return (_Left.c == _Right.c); }

Слайд 69





Пример: for_each-шаблон
template<class _InIt, class _Fn1> inline _Fn1
			     for_each(_InIt _First, _InIt _Last, _Fn1_Func) {
	for (; _ChkFirst != _ChkLast; ++_ChkFirst) 
		_Func(*_ChkFirst);
	return _Func;
}
...
class Average { 
	long amount; long sum;  
public: 
	Average() : amount(0), sum(0) {} 
	void operator()(int val) { 
		amount++; sum+=val;
	} 
	operator double() { 
		return static_cast<double>(sum)/amount; 
	} 
}; 
...
vector<int> v1; //заполнить вектор значениями
cout<<for_each(v1.begin(), v1.end(), Average());
Описание слайда:
Пример: for_each-шаблон template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1_Func) { for (; _ChkFirst != _ChkLast; ++_ChkFirst) _Func(*_ChkFirst); return _Func; } ... class Average { long amount; long sum; public: Average() : amount(0), sum(0) {} void operator()(int val) { amount++; sum+=val; } operator double() { return static_cast<double>(sum)/amount; } }; ... vector<int> v1; //заполнить вектор значениями cout<<for_each(v1.begin(), v1.end(), Average());

Слайд 70





Современное ООП вне C++. 
Расширение Микрософт 
языка C++  –  C++/CLI
Описание слайда:
Современное ООП вне C++. Расширение Микрософт языка C++ – C++/CLI

Слайд 71





Managed Extensions for C++ 
и C++/CLI
Managed Extensions for C++ компании Микрософт  появились в 2002 в связи с переходом на платформу .Net (Visual Studio .Net), в значительной мере унифицированную.
С выходом Visual C++ 2005, Managed Extensions for C++ включены в расширенный синтаксис языка Visual C++, получивший название C++/CLI.
CLI (Common Language Infrastructure) – это стандарт операционной обстановки, предназначенной для исполнения программного кода. CLR (Сommon Language Runtime) – реализация Микрософт стандарта CLI.
Этот синтаксис не является частью ANSI/ISO стандарта C++. Он стандартизован в Ecma C++/CLI Specification. 
Нами в основном будут рассмотрены аспекты расширения, связанные с управлением памятью.
Описание слайда:
Managed Extensions for C++ и C++/CLI Managed Extensions for C++ компании Микрософт появились в 2002 в связи с переходом на платформу .Net (Visual Studio .Net), в значительной мере унифицированную. С выходом Visual C++ 2005, Managed Extensions for C++ включены в расширенный синтаксис языка Visual C++, получивший название C++/CLI. CLI (Common Language Infrastructure) – это стандарт операционной обстановки, предназначенной для исполнения программного кода. CLR (Сommon Language Runtime) – реализация Микрософт стандарта CLI. Этот синтаксис не является частью ANSI/ISO стандарта C++. Он стандартизован в Ecma C++/CLI Specification. Нами в основном будут рассмотрены аспекты расширения, связанные с управлением памятью.

Слайд 72





Функции CLR
CLR обеспечивает автоматическое размещение объектов и управление ссылками на них, а также освобождение объектов, когда они больше не используются (сборка мусора). Объекты, время жизни которых управляется подобным образом, называются управляемыми данными. Сборка мусора исключает утечки памяти, появление висячих ссылок, удаление используемых объектов  и некоторые другие ошибки программирования, возможные при использовании «неуправляемых» данных.
CLR упрощает разработку компонентов и приложений, разработанных на разных языках, путем предоставления общей системы типов, определяемых средой, и саму эту среду. 
Программы компилируются в общий промежуточный язык (Common Intermediate Language, CIL), что дает возможность исполнения откомпилированного кода на любых процессорах и в любых операционных системах, поддерживающих среду выполнения.
Управляемые приложения включают метаданные, содержащие сведения о используемых компонентах и ресурсах. Среда выполнения использует эти сведения, чтобы обеспечить наличие всех необходимых ресурсов для компонента или приложения.
Описание слайда:
Функции CLR CLR обеспечивает автоматическое размещение объектов и управление ссылками на них, а также освобождение объектов, когда они больше не используются (сборка мусора). Объекты, время жизни которых управляется подобным образом, называются управляемыми данными. Сборка мусора исключает утечки памяти, появление висячих ссылок, удаление используемых объектов и некоторые другие ошибки программирования, возможные при использовании «неуправляемых» данных. CLR упрощает разработку компонентов и приложений, разработанных на разных языках, путем предоставления общей системы типов, определяемых средой, и саму эту среду. Программы компилируются в общий промежуточный язык (Common Intermediate Language, CIL), что дает возможность исполнения откомпилированного кода на любых процессорах и в любых операционных системах, поддерживающих среду выполнения. Управляемые приложения включают метаданные, содержащие сведения о используемых компонентах и ресурсах. Среда выполнения использует эти сведения, чтобы обеспечить наличие всех необходимых ресурсов для компонента или приложения.

Слайд 73





Выделение памяти в управляемой куче
При запуске приложения CLR резервирует для него непрерывную область адресного пространства –  управляемую кучу (УК). Все ссылочные типы размещаются в УК. Она хранит указатель, с которого будет выделена память для следующего объекта в куче. 
Изначально этот указатель устанавливается в базовый адрес УК текущего приложения. При создании приложением очередного объекта ссылочного типа для него выделяется память в адресном пространстве, непосредственно следующем за уже размещенными объектами (по базовому адресу УК, если их еще не было). 
Пока имеется доступное адресное пространство, память для новых объектов продолжает выделяться по этой схеме, являющейся очень эффективной.
Управляемая куча делится на два раздела. Один – для хранения мелких объектов. Второй – для объектов большого размера (>85000 байтов). Идея – большие объекты живут долго и перемещать их затратно.
Описание слайда:
Выделение памяти в управляемой куче При запуске приложения CLR резервирует для него непрерывную область адресного пространства – управляемую кучу (УК). Все ссылочные типы размещаются в УК. Она хранит указатель, с которого будет выделена память для следующего объекта в куче. Изначально этот указатель устанавливается в базовый адрес УК текущего приложения. При создании приложением очередного объекта ссылочного типа для него выделяется память в адресном пространстве, непосредственно следующем за уже размещенными объектами (по базовому адресу УК, если их еще не было). Пока имеется доступное адресное пространство, память для новых объектов продолжает выделяться по этой схеме, являющейся очень эффективной. Управляемая куча делится на два раздела. Один – для хранения мелких объектов. Второй – для объектов большого размера (>85000 байтов). Идея – большие объекты живут долго и перемещать их затратно.

Слайд 74





Освобождение памяти в управляемой куче
Когда сборщик мусора (СМ) выполняет сборку мусора, он освобождает память, выделенную для объектов, которые больше не используются приложением.
Они определяются посредством построения графа достижимости для объектов.
При обнаружении недостижимого объекта СМ выполняет копирование памяти для уплотнения достижимых объектов в памяти, освобождая блоки адресного пространства, выделенные под недостижимые объекты. Память уплотняется, только если при очистке обнаруживается значительное число недостижимых объектов. 
После уплотнения памяти, занимаемой достижимыми объектами, сборщик мусора вносит необходимые поправки в указатели приложения.
Описание слайда:
Освобождение памяти в управляемой куче Когда сборщик мусора (СМ) выполняет сборку мусора, он освобождает память, выделенную для объектов, которые больше не используются приложением. Они определяются посредством построения графа достижимости для объектов. При обнаружении недостижимого объекта СМ выполняет копирование памяти для уплотнения достижимых объектов в памяти, освобождая блоки адресного пространства, выделенные под недостижимые объекты. Память уплотняется, только если при очистке обнаруживается значительное число недостижимых объектов. После уплотнения памяти, занимаемой достижимыми объектами, сборщик мусора вносит необходимые поправки в указатели приложения.

Слайд 75





Эмпирические законы поведения объектов в куче
Уплотнять память для части управляемой кучи быстрее, чем для всей кучи. 
Более новые объекты имеют меньшее время жизни, а более старые объекты имеют большее время жизни. 
Новые объекты теснее связаны друг с другом, и приложение обращается к ним приблизительно в одно и то же время.
Описание слайда:
Эмпирические законы поведения объектов в куче Уплотнять память для части управляемой кучи быстрее, чем для всей кучи. Более новые объекты имеют меньшее время жизни, а более старые объекты имеют большее время жизни. Новые объекты теснее связаны друг с другом, и приложение обращается к ним приблизительно в одно и то же время.

Слайд 76





Поколения объектов
Объекты, созданные после последней сборки мусора или после запуска приложения до первой сборки мусора, являются объектами поколения 0.
Если приложение пытается создать новый объект, когда поколение 0 заполнено, сборщик мусора выполняет сборку, пытаясь освободить для этого объекта адресное пространство в поколении 0 (уплотняя объекты поколения 0). 
Для объектов, оставшихся после сборок мусора, их уровень повышается, и они переводятся в поколение 1.
Если уплотнение объектов поколения 0 не освободило достаточно памяти, то уплотняются объекты поколения 1, а затем снова поколение 0.
Если это не принесло результатов, то последовательно уплотняются 2-1-0 (полная сборка мусора) и переводятся из поколения в поколение 0->1, 1->2.
Объекты поколения 2 существуют до тех пор пока не будут удалены при сборке.
Описание слайда:
Поколения объектов Объекты, созданные после последней сборки мусора или после запуска приложения до первой сборки мусора, являются объектами поколения 0. Если приложение пытается создать новый объект, когда поколение 0 заполнено, сборщик мусора выполняет сборку, пытаясь освободить для этого объекта адресное пространство в поколении 0 (уплотняя объекты поколения 0). Для объектов, оставшихся после сборок мусора, их уровень повышается, и они переводятся в поколение 1. Если уплотнение объектов поколения 0 не освободило достаточно памяти, то уплотняются объекты поколения 1, а затем снова поколение 0. Если это не принесло результатов, то последовательно уплотняются 2-1-0 (полная сборка мусора) и переводятся из поколения в поколение 0->1, 1->2. Объекты поколения 2 существуют до тех пор пока не будут удалены при сборке.

Слайд 77





Расширения C++/CLI для управления памятью
ref class / ref struct –  управляемые к/с.
gcnew – выделение памяти в управляемой куче.
nullptr – константа, представляющая нулевой указатель. 
^ – управляемый указатель.  
% – управляемая ссылка. 
array – управляемый массив. 
interior_ptr / pin_ptr – специфические указатели на объекты в управляемой куче.
Описание слайда:
Расширения C++/CLI для управления памятью ref class / ref struct – управляемые к/с. gcnew – выделение памяти в управляемой куче. nullptr – константа, представляющая нулевой указатель. ^ – управляемый указатель. % – управляемая ссылка. array – управляемый массив. interior_ptr / pin_ptr – специфические указатели на объекты в управляемой куче.

Слайд 78





Управляемые классы/структуры
В то время как «родные» объекты C++ могут создаваться в разделах памяти разных типов (например, стек или куча), объекты ref-типов создаются в УК (managed heap). CLR поддерживает эту специальную кучу и реализует для нее асинхронный сборщик мусора. Обычные указатели С++ не могут указывать на объекты в УК.
	ref class MyClass {
	public: 
		int val; 
		MyClass(int i) : val(i) {}
	}; 
^ - управляемый указатель (handle to an object on the managed heap), указывает на объект управляемой кучи целиком, создается с помощью gcnew и уничтожается delete.
	MyClass ^ mp=gcnew MyClass(123); cout<<mp->val; 
% - управляемая ссылка (tracking reference), аналогична обычным ссылкам C++. Однако во время исполнения объект, на который она ссылается, может быть перемещен CLR сборщиком мусора. Управляемая ссылка размещается только на стеке. Она не может быть членом класса, но может указывать на член класса. Ей нельзя присвоить null. Управляемая ссылка может быть переприсвоена многократно.

	MyClass ^% mr=mp;  int % r=mr->val;  mr->val=r+mr->val;
Описание слайда:
Управляемые классы/структуры В то время как «родные» объекты C++ могут создаваться в разделах памяти разных типов (например, стек или куча), объекты ref-типов создаются в УК (managed heap). CLR поддерживает эту специальную кучу и реализует для нее асинхронный сборщик мусора. Обычные указатели С++ не могут указывать на объекты в УК. ref class MyClass { public: int val; MyClass(int i) : val(i) {} }; ^ - управляемый указатель (handle to an object on the managed heap), указывает на объект управляемой кучи целиком, создается с помощью gcnew и уничтожается delete. MyClass ^ mp=gcnew MyClass(123); cout<<mp->val; % - управляемая ссылка (tracking reference), аналогична обычным ссылкам C++. Однако во время исполнения объект, на который она ссылается, может быть перемещен CLR сборщиком мусора. Управляемая ссылка размещается только на стеке. Она не может быть членом класса, но может указывать на член класса. Ей нельзя присвоить null. Управляемая ссылка может быть переприсвоена многократно. MyClass ^% mr=mp; int % r=mr->val; mr->val=r+mr->val;

Слайд 79





Внутренний указатель interior_ptr
Описание слайда:
Внутренний указатель interior_ptr

Слайд 80





Пришпиленный указатель pin_ptr
Описание слайда:
Пришпиленный указатель pin_ptr

Слайд 81





Некоторые другие расширения
value class 
interface class
property
delegate
abstract
new
override
sealed
finally
for each
safe_cast
typeid
event
Описание слайда:
Некоторые другие расширения value class interface class property delegate abstract new override sealed finally for each safe_cast typeid event



Похожие презентации
Mypresentation.ru
Загрузить презентацию