Разделы презентаций


Список литературы

Содержание

Г. Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (zip), 2-е издание. — М. СПб.: «Издательство Бином» — «Невский диалект»,1998. А. Элиенс. Принципы объектно-ориентированной разработки программ, 2-е издание. — М.: Издательский

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

Слайд 1Список литературы
И. А. Волкова, А. В. Иванов, Л. Е. Карпов.

Основы объектно-ориентированного программирования. Язык программирования С++. Учебное пособие для студентов

2 курса (969.27 Кбайт). — М.: Издательский отдел факультета ВМК МГУ, 2011.
И. А. Волкова, А. А. Вылиток, Т. В. Руденко. Формальные грамматики и языки. Элементы теории трансляции (3-е издание) (1.59 Мбайт). — М.: Изд-во МГУ, 2009 (версия от 06.02.2010).
И. А. Волкова, И. Г. Головин, Л. Е. Карпов. Системы программирования (Учебное пособие) (1.2 Мбайт). — М.: Издательский отдел факультета ВМиК МГУ, 2009.
И. А. Волкова, А. А. Вылиток, Л. Е. Карпов. Сборник задач и упражнений по языку С++ (Учебное пособие для студентов 2 курса). – М.: Издательский отдел факультета ВМК МГУ, 2013.

Д. Грис. Конструирование компиляторов для цифровых вычислительных машин. — М.: Мир, 1975.
Ф. Льюис, Д. Розенкранц, Р. Стирнз. Теоретические основы проектирования компиляторов. — М.: Мир, 1979.
А. Ахо, Дж. Ульман. Теория синтаксического анализа, перевода и компиляции, т.1,2 — М.: Мир, 1979.
Л. Бек. Введение в системное программирование. — М.: Мир, 1988.
А. Ахо, Р. Сети, Дж. Ульман. Компиляторы. — М.: Изд. дом «Вильямс», 2001. (Шифр в библиотеке МГУ: 5ВГ66 А-955)
А. В. Гордеев, А. Ю. Молчанов. Системное программное обеспечение. — СПб.: Питер, 2001


Список литературыИ. А. Волкова, А. В. Иванов, Л. Е. Карпов. Основы объектно-ориентированного программирования. Язык программирования С++. Учебное

Слайд 2 Г. Буч. Объектно-ориентированный анализ и проектирование с примерами приложений

на С++ (zip), 2-е издание. — М. СПб.: «Издательство Бином» — «Невский

диалект»,1998.
А. Элиенс. Принципы объектно-ориентированной разработки программ, 2-е издание. — М.: Издательский дом «Вильямс», 2002.

И. О. Одинцов. Профессиональное программирование. Системный подход. — СПб.: БХВ-Петербург, 2002.
Н. Н. Мансуров, О. Л. Майлингова. Методы формальной спецификации программ: языки MSC и SDL. — М.: Изд-во «Диалог-МГУ», 1998.
А. М. Вендров. CASE-технологии. Современные методы и средства проектирования информационных систем. — Электронная публикация на CITFORUM.RU
М. Фаулер, К. Скотт. UML в кратком изложении. Применение стандартного языка объектного моделирования. — М.: Мир, 1999.
Г. Майерс. Искусство тестирования программ. — М.: «Финансы и статистика», 1982
С. Канер, Дж. Фолк, Е. К. Нгуен. Тестирование программного обеспечения. — М.: «DiaSoft», 2001
Дж. Макгрегор, Д. Сайкс. Тестирование объектно-ориентированного программного обеспечения. Практическое пособие. — М.: «DiaSoft», 2002.

Б. Страуструп. Язык программирования С++. Специальное издание. — М.: Издательство «БИНОМ», 2001.

Б. Страуструп. Программирование: принципы и практика использования С++.: Пер. с англ. – М. ООО «И.Д.Вильямс», 2011. – 1248 с.
Г. Шилдт. Самоучитель С++. 3-е изд. — СПб: БХВ-Петербург, 2002.

Г. Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (zip), 2-е издание. — М. СПб.:

Слайд 3Электронные ссылки
Материалы по курсу можно найти на сайте:

http://cmcmsu.no-ip.info/2course/


Некоторые электронные ссылки

на полезные книги:

http://povt.zaural.ru/edocs/uml/content.htm -
Г Буч, Д Рамбо, А Джекобсон «Язык

UML. Руководство пользователя»

http://vmk.ugatu.ac.ru/book/buch/index.htm -
Гради Буч "Объектно-ориентированный анализ и проектирование
с примерами приложений на С++"
Электронные ссылкиМатериалы по курсу можно найти на сайте:		http://cmcmsu.no-ip.info/2course/Некоторые электронные ссылки на полезные книги:http://povt.zaural.ru/edocs/uml/content.htm -Г Буч, Д Рамбо,

Слайд 4Язык C++
С++ позволяет справиться с возрастающей сложностью программ (в отличие

от С).

Автор – Бьёрн Страуструп.

Стандарты (комитета по стандартизации ANSI) –

1998, 2011, 2014.

С++:
лучше С,
поддерживает абстракции данных,
поддерживает объектно-ориентированное
программирование (ООП).
Язык C++С++ позволяет справиться с возрастающей сложностью программ (в отличие от С).Автор – Бьёрн Страуструп.Стандарты (комитета по

Слайд 5Парадигмы программирования
Все программы состоят из кода и данных и каким-либо

образом концептуально организованы вокруг своего кода и\или данных.

Основные парадигмы (технологии)

программирования
определяют способ построения программ:

процедурно-ориентированная (при кот. программа – это ряд последовательно выполняемых операций, причём код воздействует на данные, например в программах на С),

объектно-ориентированная (при кот. программа состоит из объектов – программных сущностей, объединяющих в себе код и данные, взаимодействующих друг с другом через определенные интерфейсы, при этом доступ к коду и данным объекта осуществляется только через сам объект, т.е. данные определяют выполняемый код),

функциональная,

логическая.
Парадигмы программированияВсе программы состоят из кода и данных и каким-либо образом концептуально организованы вокруг своего кода и\или

Слайд 6Постулаты ООП.
Абстракция - центральное понятие ООП.
Абстракция позволяет программисту справиться

со сложностями решаемых им задач.

Мощный способ создания абстракций –

иерархическая

классификация

типовая структурная
(структура классов) (структура объектов)

Основные механизмы (постулаты) ООП:
инкапсуляция,
наследование,
полиморфизм.

Постулаты ООП.Абстракция - центральное понятие ООП. Абстракция позволяет программисту справиться со сложностями решаемых им задач.Мощный способ создания

Слайд 7ИНКАПСУЛЯЦИЯ
Инкапсуляция - механизм,
- связывающий вместе код и данные, которыми

он манипулирует;
- защищающий их от произвольного доступа со

стороны другого кода, внешнего по отношению к рассматриваемому.

Доступ к коду и данным жестко контролируется интерфейсом.
Основой инкапсуляции является класс.

Класс - это механизм (пользовательский тип данных) для создания объектов.
Объект класса - переменная типа класс или экземпляр класса.
Любой объект характеризуется состоянием (значениями полей данных) и поведением (операциями над объектами, задаваемыми определенными в классе функциями, которые называют методами класса).

ИНКАПСУЛЯЦИЯИнкапсуляция - механизм, 	- связывающий вместе код и данные, которыми он манипулирует;  	- защищающий их от

Слайд 8НАСЛЕДОВАНИЕ
Наследование - механизм, с помощью которого один объект (производного класса)

приобретает свойства другого объекта (родительского, базового класса).

Наследование позволяет объекту

производного класса наследовать от своего родителя общие атрибуты, а для себя определять только те характеристики, которые делают его уникальным внутри класса.

Производный класс конкретизирует, в общем случае расширяет базовый класс.
Наследование поддерживает концепцию иерархической классификации.

Новый класс не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста.


НАСЛЕДОВАНИЕНаследование - механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базового класса).

Слайд 9ПОЛИМОРФИЗМ
Полиморфизм - механизм, позволяющий использовать один и тот же интерфейс

для общего класса действий.

В общем случае концепция полиморфизма выражается

с помощью фразы "один интерфейс - много методов".
Выбор конкретного действия (метода) применительно к конкретной ситуации возлагается на компилятор. Программисту же достаточно запомнить и применять один интерфейс, вместо нескольких, что также упрощает его работу.

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

ПОЛИМОРФИЗМПолиморфизм - механизм, позволяющий использовать один и тот же интерфейс для общего класса действий. В общем случае

Слайд 10Декомпозиция задачи
При программировании в объектно-ориентированном стиле на первое место выходит

проектирование решения задачи, т.е определение того, какие классы и объекты

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

Декомпозиция – научный метод, использующий структуру задачи и позволяющий разбить решение одной большой задачи на решения серии меньших задач, возможно взаимосвязанных, но более простых.
Декомпозиция задачиПри программировании в объектно-ориентированном стиле на первое место выходит проектирование решения задачи, т.е определение того, какие

Слайд 11Синтаксис класса
class имя_класса {
[private:]
закрытые члены класса (функции, типы и поля-данные)
public:
открытые

члены класса (функции, типы и поля-данные)
protected:
защищенные члены класса
} список_объектов;

Описание объектов

– экземпляров класса:
имя_класса список объектов;
// служ. слово class не требуется

Классы С++ отличаются от структур С++ только правилами определения по умолчанию
прав доступа к первой области доступа членов класса и
типа наследования:
для структур – public,
для классов – private.
Синтаксис классаclass имя_класса {[private:]		закрытые члены класса (функции, типы и поля-данные)public:		открытые члены класса (функции, типы и поля-данные)protected:		защищенные члены

Слайд 12Члены класса
Члены-данные;
Члены-функции (методы);
Члены-типы – вложенные пользовательские типы,
Правила доступа к членам

класса и поиска их имен единообразны для всех членов класса

и не зависят от их вида.
Ex.: class X {
double t; // Данное
public:
void f ( ); // метод
int a; // данное
enum { e1, e2, e3 } g;
private:
struct inner { // вложенный класс
int i, j;
void g ( );
};
inner c;
};
...
X x; x.a = 0; x.g = X::e1;
Члены классаЧлены-данные;Члены-функции (методы);Члены-типы – вложенные пользовательские типы,	Правила доступа к членам класса и поиска их имен единообразны для

Слайд 13Действия над объектами классов
Над объектами класса можно производить следующие действия:


присваивать объекты одного и того же класса (при этом производится

почленное копирование членов данных),
получать адрес объекта с помощью операции &,
передавать объект в качестве формального параметра в функцию,
возвращать объект в качестве результата работы функции.
осуществлять доступ к элементам объекта с помощью операции ‘.’, а если используется указатель на объект, то с помощью операции ‘->’.
вызывать методы класса, определяющие поведение объекта.
Действия над объектами классовНад объектами класса можно производить следующие действия: присваивать объекты одного и того же класса

Слайд 14Пример класса
...
class A {
int a;
public:
void set_a (int n);
int get_a

( ) const { return a; } // Константные методы

класса
// не изменяют состояние своего объекта
};

void A::set_a (int n) {
a = n;
}

int main () {
A obj1, obj2;
obj1.set_a(5);
obj2.set_a(10);
cout << obj1.get_a ( ) << ‘\n’;
cout << obj2.get_a ( ) << endl;
return 0;
}
Пример класса...class A { 	int a;public:	void set_a (int n);	int get_a ( ) const { return a; }

Слайд 15АТД (абстрактный тип данных)

АТД называют тип данных с полностью скрытой

(инкапсулированной) структурой, а работа с переменными такого типа происходит только

через специальные, предназначенные для этого функции.

В С++ АТД реализуется с помощью классов (структур), в которых нет открытых членов-данных.

Класс А из предыдущего примера является абстрактным типом данных.
АТД (абстрактный тип данных)АТД называют тип данных с полностью скрытой (инкапсулированной) структурой, а работа с переменными такого

Слайд 16О терминологии
Оператор (statement) – действие, задаваемое некоторой конструкцией языка.

Операция (operator,

для обозначения операций языка: +, *, =, и др.) –

используются в выражениях.

Определение (описание) переменной (definition) - при этом отводится память, производится инициализация, определение возможно только 1 раз.

Объявление переменной (declaration) - дает информацию компилятору о том, что эта переменная где-то в программе описана.

Для преобразования типов используются два термина – преобразование (conversion) и приведение (cast).
О терминологииОператор (statement) – действие, задаваемое некоторой конструкцией языка.Операция (operator, для обозначения операций языка: +, *, =,

Слайд 17Некоторые отличия С++ от С
Введен логический тип bool и константы

логического типа true и false.

В С++ отсутствуют типы по умолчанию

(например, обязательно
int main () {…} ).

Локальные переменные можно описывать в любом месте программы, в частности внутри цикла for. Главное, чтобы они были описаны до их первого использования.
По стандарту С++ переменная, описанная внутри цикла for, локализуется в теле этого цикла.

В С++ переработана стандартная библиотека.
В частности, в стандартной библиотеке С++ файл заголовков ввода/вывода назвается , введены классы, соответствующие стандартным (консольным) потокам ввода – класс istream – и вывода – класс ostream, а также объекты cin (класса istream) и cout и cerr (класса ostream).
Через эти объекты доступны операции ввода >> из стандартного потока ввода (например, cin >> x ;), и вывода << в стандартный поток вывода (например, cout << ”string” << S << ‘\n’;), при использовании которых не надо указывать никакие форматирующие элементы.
Некоторые отличия С++ от СВведен логический тип bool и константы логического типа true и false.В С++ отсутствуют

Слайд 18Работа с динамической памятью
int *p,*m;

p = new int ;

или
p = new int (1); или
m = new int

[10]; - для массива из 10 элементов;
массивы, создаваемые в динамической памяти инициализировать нельзя;
…….
delete p; или
delete [ ] m; - для удаления всего массива;
Работа с динамической памятью		int *p,*m;		p = new int ;  или		p = new int (1);  или		m

Слайд 19Значения параметров функции по умолчанию
Пример:

void f (int a, int

b = 0, int c =1);

Обращения к функции:

f(3) //

a = 3, b = 0, c = 1;
f(3, 4) // a = 3, b = 4, c = 1;
f(3, 4, 5) // a = 3, b = 4, c = 5.
Значения параметров функции  по умолчаниюПример: 		void f (int a, int b = 0, int c =1);Обращения

Слайд 20Пространства имен
Пространства имен вводятся только на уровне файла, но не

внутри блока.

namespace std {
// объявления, определения
}
Ex: std::cout

std::endl;

namespace NS {
char name [ 10 ] ;
namespace SP {
int var = 3;
}
}
Ex: ... NS::name ...; NS::SP::var += 2;

#include
using namespace std;

using NS::name;

Пространства именПространства имен вводятся только на уровне файла, но не внутри блока.	namespace std {		// объявления, определения	}Ex:

Слайд 21Указатель this
Иногда для реализации того или иного метода возникает

необходимость иметь указатель на «свой» объект, от имени которого производится

вызов данного метода.

В C++ введено ключевое слово this, обозначающее «указатель на себя», которое можно трактовать как неявный параметр любого метода класса:
<имя класса> * const this;
*this – сам объект.

Таким образом, любой метод класса имеет на один (первый) параметр больше, чем указано явно.

This, участвующий в описании функции, перегружающей операцию, всегда указывает на самый левый (в выражении с этой операцией) операнд операции.

В реальности поле this не существует (не расходуется память), и при сборке программы вместо this подставляется соответствующий адрес объекта.
Указатель  thisИногда для реализации того или иного метода возникает необходимость иметь указатель на «свой» объект, от

Слайд 22Специальные методы класса
Конструктор – метод класса, который

имеет имя, в точности

совпадающее с именем самого класса;
не имеет типа возвращаемого значения;
всегда вызывается

при создании объекта (сразу после отведения памяти под объект в соответствии с его описанием).

Деструктор – метод класса, который

имеет имя, совпадающее с именем класса, перед первым символом которого приписывается символ ~ ;
не имеет типа возвращаемого значения и параметров;
всегда вызывается при уничтожении объекта (перед освобождением памяти, отведенной под объект).
Специальные методы классаКонструктор – метод класса, которыйимеет имя, в точности совпадающее с именем самого класса;не имеет типа

Слайд 23Специальные методы класса
class A {
......
public:
A ( );

// конструктор умолчания
A (A &

y); // A (const A & y); конструктор копирования (КК)
[explicit] A (int x); // конструктор преобразования; explicit запрещает // компилятору неявное преобразование int в А
A (int x, int y);
// A (int x = 0, int y = 0); // заменяет 1-ый, 3-ий и 4-ый
// конструкторы
~A (); // деструктор
......
};
Int main () {
A a1, a2 (10), a3 = a2;
A a4 = 5, a5 = A(7); // Err!, т.к. временный объект не может быть
// параметром для неконстантной ссылки в КК
// О.К., если будет A (const A & y)
A *a6 = new A (1);
}
Специальные методы классаclass A {	......	public:				  A ( );	     // конструктор умолчания

Слайд 24Правила автоматической генерации специальных методов класса

Если в классе явно не описан

никакой конструктор, то конструктор умолчания генерируется автоматически с пустым телом

в public области.

Если в классе явно не описан конструктор копирования, то он всегда генерируется автоматически в public области с телом, реализующим почленное копирование значений полей-данных параметра конструктора в значения соответствующих полей-данных создаваемого объекта

Если в классе явно не описан деструктор, то он всегда генерируется автоматически с пустым телом в public области.
Правила автоматической генерации специальных методов классаЕсли в классе явно не описан никакой конструктор, то конструктор умолчания генерируется

Слайд 25Класс Box
class Box {
int l; // length – длина
int w;

// width – ширина
int h; // height – высота
public:


int volume () const { return l * w * h ; }
Box (int a, int b, int c ) { l = a; w = b; h = c; }
Box (int s) { l = w = h = s; }
Box ( ) { w = h = 1; l = 2; }
int get_l ( ) const { return l; }
int get_w ( ) const { return w; }
int get_h ( ) const { return h; }
};
Автоматически сгенерированные конструктор копирования и операция присваивания:
Box (const Box & a) { l = a.l; w = a.w; h = a.h; }

Box & operator = ( const Box & a) { l = a.l; w = a.w; h = a.h; return * this; }

Конструктор копирование и операцию присваивания можно переопределить.
Класс Boxclass Box {	int l; 		// length – длина	int w; 		// width – ширина	int h; 		// height

Слайд 26Неплоский класс string
class string {
char * p; // здесь потребуется

динамическая память,
int size;
public:
string (const char * str);
string (const string &

a);
~string ( ) { delete [ ] p; }
string & operator= (const string & a);
...
};

string :: string (const char * str) {
p = new char [ ( size = strlen (str) ) + 1];
strcpy (p, str);
}

string :: string (const string & a) {
p = new char [ (size = a.size) + 1];
strcpy (p, a.p);
}
Неплоский класс stringclass string {char * p; 	// здесь потребуется динамическая память,int size;public:string (const char * str);string

Слайд 27Пример использования класса string
void f {
string s1 (“Alice”); s1
string s2 =

s1; s2
string s3 (“Kate”); s3
...
s3 = s1;
}
{... s1...s2 {...s3...}...s1...s2}

Пример использования класса stringvoid f {		string s1 (“Alice”);	s1	 	string s2 = s1;		s2 	string s3 (“Kate”);	s3		...						s3 = s1;}{...

Слайд 28Переопределение операции присваивания

string & string :: operator = (const string

& a) {

if (this == & a)
return * this;

// если a = a
delete [ ] p;
p = new char [ (size = a.size) + 1];
strcpy (p, a.p);
return * this;
}

При этом: s1 = s2 ~ s1.operator= (s2);
Переопределение операции присваиванияstring & string :: operator = (const string & a) {	if (this == & a)

Слайд 29Композиция (строгая агрегация) объектов
class Point { class Z {
int x; Point p;
int

y; int z;
public: public:
Point ( ); Z ( int с ) { z

= c; };
Point ( int, int ); ...
... };
};

Z * z = new Z (1); // Point ( ); Z(1);
delete z; // ~Z(); ~Point();

Использование списка инициализации при описании конструктора:

Z :: Z ( int c ) : p (1, 2) { z = c; } или
Z :: Z ( int c ) : p (1, 2), z (c) { }

Композиция (строгая агрегация) объектовclass Point {					class Z {		int x;							Point p;		int y;							int z;public:						public:		Point ( );						Z ( int с

Слайд 30Cсылки 1
Ссылочный тип данных задается так: &

Ссылка (reference) – переменная

ссылочного типа.

Единственная операция над ссылками – инициализация (установление связи с

инициализатором) при создании, при этом ссылка обозначает (именует) тот же адрес памяти, что и ее инициализатор (L-value выражение).

После описания и обязательной инициализации ссылку можно использовать точно так же, как и соответствующий ей инициализатор.

Фактически ссылка является синонимом своего инициализатора.

Ссылочный тип данных в С++ используется в следующих случаях:

a). Описание переменных-ссылок (локальных или глобальных).
Например,
int i = 5;
int & yeti = i; //ссылка обязательно должна быть инициализирована
// yeti – синоним имени i ; &i ≡ &yeti;
i = yeti + 1;
yeti = i + 1;
cout << i << yeti; //напечатается 7 7

Cсылки 1Ссылочный тип данных задается так:		 &Ссылка (reference) – переменная ссылочного типа.Единственная операция над ссылками – инициализация

Слайд 31Cсылки 2
b). Передача параметров в функции по ссылке.
Инициализация формального параметра

ссылки происходит в момент передачи фактического параметра (L-value выражения), и

далее все действия, выполняемые с параметром-ссылкой, выполняются с соответствующим фактическим параметром.

Пример: void swap (int & x, int & y) {
int t = x;
x = y;
y = t;
}
Пример обращения к функции swap: int a = 5, b = 6;
swap (a, b);

c). Возвращение результата работы функции в виде ссылки - для более эффективной реализации функции - т.к. не надо создавать временную копию возвращаемого объекта – и в том случае, когда возвращаемое значение должно быть L-value-выражением.
Инициализация возвращаемой ссылки происходит при работе оператора return, операндом которого должно быть L-value выражение. Не следует возвращать ссылку на локальный объект функции, который перестает существовать при выходе из функции.

Пример: int & f( ) {
int * p = new int(5);
return *p;
}
Пример обращения к функции f: int & x = f();

Cсылки 2b). Передача параметров в функции по ссылке.Инициализация формального параметра ссылки происходит в момент передачи фактического параметра

Слайд 32Cсылки 3
d). Использование ссылок – членов-данных класса.
Инициализация поля-ссылки класса обязательно

происходит через список инициализации конструктора, вызываемого при создании объекта.

Пример: class

A {
int x;
public:
int & r;
A( ) : r (x) {
x = 3;
}
A(const A &); // !!!
A & operator= (const A&); // !!!
...
};
int main () {
A a;
...
}

Cсылки 3d). Использование ссылок – членов-данных класса.Инициализация поля-ссылки класса обязательно происходит через список инициализации конструктора, вызываемого при

Слайд 33Cсылки 4 Константные ссылки
е). Использование ссылок на константу– формальных параметров функций

(для эффективности реализации в случае объектов классов).
Инициализация параметра – ссылки

на константу происходит во время передачи фактического параметра, который, в частности, может быть временным объектом, сформированным компилятором для фактического параметра-константы.

Пример: struct A {
int a;
A( int t = 0) { a = t; }
};
int f (const int & n, const A & ob) {
return n+ob.a;

}
int main () {
cout << f (3, 5) << endl;
...
}

Cсылки 4 Константные ссылкие). Использование ссылок на константу– формальных параметров функций (для эффективности реализации в случае объектов

Слайд 34Временные объекты
Временные объекты создаются в рамках выражений (в частности,

инициализирующих), где их можно модифицировать (применять неконстантные методы, менять значения

членов-данных).
В общем случае «живут» временные объекты до окончания вычисления соответствующих выражений.
НО! Если инициализировать ссылку на константу временным объектом (в частности, передавать временный объект в качестве параметра для формального параметра – ссылки на константу), время его жизни продлевается до конца жизни соответствующей ссылочной переменной.
НЕЛЬЗЯ инициализировать неконстантную ссылку временным объектом (в частности, неконстантные ссылки – формальные параметры).

Пример: struct A {
A (int);
A (const A &);
};
… const A & r = A (1); // если здесь и в КК убрать const,
A a1 = A (2); // все эти конструкции будут
A a2 = 3; … // ошибочными
Важно! Компилятор ВСЕГДА сначала проверяет синтаксическую и семантическую (контекстные условия) правильность, а затем оптимизирует!!!
Временные объекты Временные объекты создаются в рамках выражений (в частности, инициализирующих), где их можно модифицировать (применять неконстантные

Слайд 35Порядок вызова конструкторов и деструкторов
При вызове конструктора класса выполняются:

конструкторы базовых

классов (если есть наследование),

конструкторы умолчания всех вложенных объектов в порядке

их описания в классе,

собственный конструктор (при его вызове все поля класса уже проинициализированы, следовательно, их можно использовать).

Деструкторы выполняются в обратном порядке:

собственный деструктор (при этом поля класса ещё не очищены, следовательно, доступны для использования),

автоматически вызываются деструкторы для всех вложенных объектов в порядке, обратном порядку их описания в классе,

деструкторы базовых классов (если есть наследование).
Порядок вызова конструкторов и деструкторовПри вызове конструктора класса выполняются:конструкторы базовых классов (если есть наследование),конструкторы умолчания всех вложенных

Слайд 36Вызов конструктора копирования
явно,
2. в случае:
Box a (1, 2, 3);
Box b

= a; // a – параметр конструктора копирования,

3. в случае:

Box c = Box (3, 4, 5);
// сначала создается временный объект и вызывается
// обычный конструктор, а затем работает конструктор
// копирования при создании объекта с; если компилятор
// оптимизирующий, вызывается только обычный
// конструктор с указанными параметрами;

4. при передаче параметров функции по значению (при создании локального объекта);

5. при возвращении результата работы функции в виде объекта,

6. при генерации исключения-объекта.
Вызов конструктора копированияявно,2. в случае:	Box a (1, 2, 3);	Box b = a; // a – параметр конструктора

Слайд 37Вызов других конструкторов

явно,

при создании объекта (при обработке описания объекта),

при создании

объекта в динамической памяти (по new), при этом сначала в

«куче» отводится необходимая память, а затем работает соответствующий конструктор,

при композиции объектов наряду с собственным конструктором вызывается конструктор объекта – члена класса,

при создании объекта производного класса также вызывается конструктор и базового класса,

при автоматическом приведении типа с помощью конструктора преобразования.
Вызов других конструкторовявно,при создании объекта (при обработке описания объекта),при создании объекта в динамической памяти (по new), при

Слайд 38Вызов деструктора

явно,

при свертке стека - при выходе из блока описания

объекта, в частности при обработке исключений, завершении работы функции;

при уничтожении

временных объектов - сразу, как только завершается конструкция, в которой они использовались;

при выполнении операции delete для указателя на объект (инициализация указателя - с помощью операции new), при этом сначала работает деструктор, а затем освобождается память.

при завершении работы программы при удалении глобальных/статических объектов.

Конструкторы вызываются в порядке определения объектов в блоке. При выходе из блока для всех автоматических объектов вызываются деструкторы, в порядке, противоположном порядку выполнения конструкторов.
Вызов деструктораявно,при свертке стека - при выходе из блока описания объекта, в частности при обработке исключений, завершении

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика