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


Классы и объекты

Содержание

Что делать, если объект описывается сложным по составу набором атрибутов?Как было: структурыДанные о сотруднике: фамилия, имя, день рождения Можно использовать структурыtypedef struct { char d; char m; short y;} date;struct Emp{

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

Слайд 1Было:
Объектное программирование
DATA
CODE
Стало:
Процедурное программирование
Объектно-ориентированное

Объект: некоторая структура, которая включает в себя данные

и код, который взаимодействует с этими данными.
Для создания объектов используют

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

class <имя класса>
{
[описание данных]
[описание кода]
};

Класс – тип данных, объект – экземпляр класса:
<имя класса> <объект1>, <объект2>,…

Вычисление в ООП рассматривается как модель поведения

Было:Объектное программированиеDATACODEСтало:Процедурное программированиеОбъектно-ориентированноеОбъект: некоторая структура, которая включает в себя данные и код, который взаимодействует с этими данными.Для

Слайд 2Что делать, если объект описывается сложным по составу набором атрибутов?
Как

было: структуры
Данные о сотруднике: фамилия, имя, день рождения
Можно использовать

структуры

typedef struct {
char d;
char m;
short y;
} date;

struct Emp{
char * FNam;
char * SNam;
date Bday;
};

Emp exampl;
exampl.FNam="aaa";

Что делать, если объект описывается сложным по составу набором атрибутов?Как было: структурыДанные о сотруднике: фамилия, имя, день

Слайд 3Структура – это объединенное в единое целое множество уникально именованных

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

группы:
struct InspectSheet {
int Number; //Номер в списке
char Names[40]; //Фамилия ИО
int Mark; //Отметка
};
Формат определения структурного типа:

struct <имя_структурного_типа>
{<определения_элементов>};
Внимание! <имя_структурного_типа> в некотором смысле эквивалентна типу (int, double и т.п.), а не имени переменной.

Определение cтруктуры

Структура – это объединенное в единое целое множество уникально именованных элементов данных, которые могут быть разных типов.Например,

Слайд 4struct List {// Определяем тип данных
// обычно в заголовочном

файле
int n;
char Name[40];
};

 
void Function()
{
struct List Student;
// Определяем переменную

структурного типа
struct List *pStudent;
// Определяем указатель на переменную структурного типа
struct List Students[30];
// Определяем массив переменных структурного типа

}

Пример использования структуры

struct List {// Определяем тип данных	 // обычно в заголовочном файлеint n;char Name[40];};… void Function(){  struct List

Слайд 5typedef struct {}
;

В этом случае используется безымянный

структурный тип.
typedef struct
{
double real;
double imag;
} complex;

При таком

описании структурного типа определение
соответствующих переменных в программе выглядит как:

complex first;
// Определяем переменную типа complex
complex *pfirst;
// Определяем указатель на переменную типа complex
complex arrayN[100];
// Определяем массив переменных типа complex

Определение структуры - ещё

typedef struct {} ; В этом случае используется безымянный структурный тип. typedef struct {double real;double imag;} complex;

Слайд 6Обеспечивается с помощью уточненных имен. Уточненное имя – это выражение

с двумя операндами и операцией «точка» между ними. Операция «точка»

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

if (delta.real > 0) …
sigma.real +=2;
n = sigma.imag * sigma.imag;
strcpy(work, Var1.Name);

Доступ к элементам структур

Обеспечивается с помощью уточненных имен. Уточненное имя – это выражение с двумя операндами и операцией «точка» между

Слайд 7В качестве элементов структуры могут указываться массивы. Предположим мы хотим

описывать изображение, представленное совокупностью разноцветных шаров в пространстве. Каждый шар

тогда определяется структурой

struct BALL{
char color;
double radius;
float coord[3];
} ball ={’r’, 3.4, {1.0, 2.2, -3.5}};

Удаление центра шара от начала координат может быть записано как

int i;
double s=0.0;
for (i=0; i<3; i++)
s += ball.coord[i]* ball.coord[i];
printf(”%8.2lf”, sqrt(s));

Элементы структур - массивы

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

Слайд 8Структуры могут группироваться в массивы.

complex Vl [100];
struct COMPLEX

V2[200];

Для доступа к элементам структур, представленных массивом, используются уточненные

имена с индексированием первого имени (массива структур).

struct BALL VarBalls[100];

…VarBalls[2].color //Цвет третьего шара
…VarBalls[k+1].coord[0]
// Первая координата k+1-го шара

Массивы структур

Структуры могут группироваться в массивы. complex Vl [100]; struct COMPLEX V2[200]; Для доступа к элементам структур, представленных

Слайд 9struct COMPLEX *pC;
complex *pcmpl;
Можно вводить

указатели в качестве обозначений структур
struct birth {
char Where[40];
struct date When;
}

*pB1, *pB2;
Возможно также:
typedef struct COMPLEX
{
double real;
double imag;
} complex, *ptr_comp;
для определения переменной типа указатель на структуру:
ptr_comp px [12];
complex * px [12];
- одинаково определяют массивы из 12-ти указателей на структуру complex.

Указатели на структуры

struct COMPLEX *pC;complex *pcmpl;    Можно вводить указатели в качестве обозначений структурstruct birth {char Where[40];struct

Слайд 10Доступ к элементам структуры, определенной через указатель
Доступ к элементам через

указатель
осуществляется одним из двух способов:
*указатель на структуру.имя элемента

указатель на структуру -> имя элемента
Первый способ традиционный, он основан на равенстве
если pAdr == &adr, то *pAdr == adr.

Обычно применяют второй способ, связанный с использованием специальной операции «->». Эта операция, наряду со скобками и операцией «.» имеет наивысший приоритет. Операция «стрелка» обеспечивает доступ к элементу структуры через адресующий ее указатель того же структурного типа. Операция «стрелка» иногда называется операцией косвенного выбора элемента структурного объекта, адресуемого указателем.

if (pdelta->real > 0) …
psigma->real +=2;
d = ptr_c->imag * ptr_c->imag;
strcpy(work, pVar1->Name);
Доступ к элементам структуры, определенной через указательДоступ к элементам через указатель осуществляется одним из двух способов: *указатель

Слайд 11Программируя, мы всегда строим некоторую специальную модель фрагмента реального мира!
Определение

класса
Объект – куб
Данные: – сторона куба а
а
а
а
Вычисления = методы:

объем V = а
– площадь поверхности S = 6 а

3

2

В описание объекта входят данные и методы (в виде функций)

class Cube {
public:
double a;

double Volume() { return a*a*a;}
double Surface () { return 6*a*a;}
};

Oдин из простейших видов описания соответствующего класса в языке C++:

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

Программируя, мы всегда строим некоторую специальную модель фрагмента реального мира!Определение классаОбъект – кубДанные: 	 – сторона куба

Слайд 12Объявление и определение методов класса
// Это в файле cube.h
class Cube

{
public:
double a;

double Volume();
double Surface

();
};

Oбъявление (declaration) методов класса обычно выносится в заголовочный файл. При объявлении класса достаточно определить только интерфейс встроенных в него методов. При объявлении прототипов функций возможно употребление спецификаторов friend, static, virtual and inline и квалификатора const. (Хотя friend делает функцию внеклассовой). Определение (definition) методов (их программная реализация) обычно осуществляется в файле исходного текста на языке С++.


// Это в файле cube.cpp
#include

double Cube::Volume()
{
return a*a*a;
}

double Cube::Surface ()
{
return 6*a*a;
}

Объявление и определение методов класса// Это в файле cube.hclass Cube {public:  double a;  double Volume();

Слайд 13Как определить объект куб в программе на языке С++?
Использование класса
Объект

– куб
а
а
а
Предположим, что описание класса Cube выполнено в файле с

именем cube.h.

Файл cube.cpp может быть таким:

#include ”cube.h”
#include
using namespace std;

void main()
{
Cube c1;
c1.a =2;
cout<<" Volume = " << c1.Volume() << endl;
cout<<" Surface = " << c1.Surface() << endl;
};

Oдин из вариантов
использования
класса:

Как определить объект куб в программе на языке С++?Использование классаОбъект – кубаааПредположим, что описание класса Cube выполнено

Слайд 14
А теперь динамический объект!
Объект и поведение
Объект – цветной круг, двигающийся

на плоскости
данные: – радиус круга R
– координаты центра круга

(X и Y)
– цвет круга Color

методы: – площадь круга S = πR
– сдвиг круга на плоскости
– замена цвета круга

2

В описание объекта входят:

class circle
{
public:
double R;
int X, Y;
long Color;

double Area() { return 3.14 * R * R; }
void Shift(int dX, int dY) { X += dX; Y += dY; }
void ChangeColor(long NewColor)
{ Color = NewColor; }
};

Oписание соответствующего класса в языке C++:

А теперь динамический объект!Объект и поведениеОбъект – цветной круг, двигающийся на плоскостиданные: – радиус круга R	 –

Слайд 15
Создание класса при помощи Мастера 1

Создание класса при помощи Мастера 1

Слайд 16
Создание класса при помощи Мастера 2

Создание класса при помощи Мастера 2

Слайд 17Файл Rct.h:

#pragma once

class CRct
{
public:
CRct(void); // Конструктор
~CRct(void); // Деструктор
};

Создание

класса при помощи Мастера 3


Файл Rct.cpp:

#include "StdAfx.h"
#include "Rct.h"

CRct::CRct(void)
{
}

CRct::~CRct(void)
{
}

Файл Rct.h:#pragma onceclass CRct{public: CRct(void);	 // Конструктор ~CRct(void); // Деструктор};Создание класса при помощи Мастера 3Файл Rct.cpp:#include

Слайд 18 Конструктором называется метод, одноименный с именем класса и выполняемый при

создании объекта данного класса.
Конструктор – это метод. Метод –

это функция. Функция может иметь набор аргументов (параметров).

Существует 2 формы определения конструктора с параметрами:

Cube (double d) { a=d;}
это эквивалентно
Cube (double d): a(d) { }

Функция может не иметь параметров – это значит, что конструктор может быть задан в форме:
Cube () { a=1.0; }
При выполнении такого конструктора создается объект куб, размер ребра которого автоматически будет установлен в 1.


Конструктор

Как описать действия, выполняемые при создании нового объекта?

Конструктором называется метод, одноименный с именем класса и выполняемый при создании объекта данного класса. 	Конструктор – это

Слайд 19Наряду с перечисленными формами существует конструктор либо не имеющий параметров,

либо все аргументы которого заданы по умолчанию – конструктор по

умолчанию:

Cube ( ) { a = 1.0; } или
Cube(double = 1.0)) { } эквивалентно Cube ( ): a(1.0) { }

Каждый класс может иметь только один конструктор по умолчанию.

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

Конструктор по умолчанию

Почему введенные ранее нами классы Cube и circle не имели в своем описании конструкторов?

Однако!
Генерация проводится только в случае отсутствия описания других конструкторов класса!

Конструктор реализуется как функция, не возвращающая никакого значения. Это означает, что в конструкторе нельзя использовать операторы return (выражение)

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

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

Слайд 20 Все конструкторы класса должны отличаться друг от

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

конкретной ситуации.
Но имя конструктора должно совпадать с именем класса.
Это означает, что единственной возможностью для различия альтер-нативных конструкторов является состав принимаемых параметров.

В качестве примера предположим, что в состав класса circle дополнительно включены конструкторы:
1) circle ( ) { R = 0.0; X = Y = 0; Color = 0; } //Конструктор по умолчанию
2) circle ( double r);
3) circle ( double r, int x, int y);
4) circle ( double r , int x, int y, long Color);

Множество конструкторов класса

В одном классе может быть множество конструкторов?

Все конструкторы класса должны отличаться друг от друга, чтобы компилятор мог определить, какой из

Слайд 21Деструктором называется метод, вызываемый при разрушении объекта данного класса.
Имя

деструктора совпадает с именем класса и начинается с символа ~.


Пример: ~Cube( ) { }.
В каждом классе может быть только один деструктор.
Деструктор не имеет параметров.
Деструктор не может быть перегружен.
Если в описании класса деструктор явно не определен, то компилятор будет генерировать его автоматически.
Деструктор не выполняет действия, связанные с освобождением занятой объектом памяти, а предшествует этому освобождению.
Чаще всего потребность в деструкторе возникает при необходимости освобождения захваченной объектом динамической оперативной памяти!

Деструкторы

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

Слайд 22class Cl
{
public:
Cl(int number) { n = number; ptr =

new int[n]; };
~Cl() { delete [] ptr; };

private:
int

n;
int *ptr;
};

Cl ccll(10);

Деструкторы - пример

class Cl{public: Cl(int number) { n = number; ptr = new int[n]; }; ~Cl() { delete []

Слайд 23
class cl {
int id;
public:
cl(int n) {id

= n; cout

}
~cl() {cout << "Destructor " << id << endl;}
} obj1(1);

void func () { static cl obj5(5); }

void main()
{
cout << "Begin\n";
cl obj2(2);
{
cl obj3(3);
}
cl obj4(4); func (); func (); func ();
cout << "End\n";
}

Конструкторы и деструкторы - пример

class cl {  int id;public:  cl(int n) {id = n; cout

Слайд 24 Деструкторы могут вызываться из программы. Однако на практике этого применять

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

глобальных объектов вызываются в первую очередь, до выполнения первого действия в функции main(). Деструкторы глобальных объектов вызываются самыми последними – после того, как отработала функция main().
Жизнь локальных объектов, как и жизнь обычных переменных встроенных типов ограничивается областью видимости. Конструкторы таких объектов вызываются в месте создания объекта, деструкторы – после выхода из блока (области видимости).
Конструкторы статических объектов вызываются один раз при первом достижении команды создания объекта, а деструкторы – после завершения функции main().
Если несколько объектов создаются в одном блоке, то конструкторы таких объектов вызываются в порядке создания объектов, а деструкторы – в обратном порядке.

Конструкторы и деструкторы - правило

Деструкторы могут вызываться из программы. Однако на практике этого применять не стоит, особенно, если работа деструктора связана

Слайд 25 Среди всего множества альтернативных конструкторов класса выделим

еще один, тот, который описан с единственным параметром – объектом

создаваемого при помощи этого конструктора класса. В качестве примера такого конструктора рассмотрим

circle (const circle& Exist);

Такой конструктор носит название конструктора копирования.

Предполагается, что семантика этого конструктора связана с построением копии объекта-параметра.

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


Конструктор копирования

Как можно построить (создать) объект как копию уже существующего?

Среди всего множества альтернативных конструкторов класса выделим еще один, тот, который описан с единственным

Слайд 26
#include "iostream“
using namespace std;
class Cl {
public:
int *ptr;

Cl(int numb) { ptr = new int(numb); cout

}
~Cl() { delete ptr; cout << "Destructor\n"; }
void print () { cout << "*ptr = " << *ptr << endl; }
};

void main()
{
Cl obj1(5);
{
Cl obj2 = obj1;
obj2.print();
}
Cl obj3(10);
obj1.print();
}


Конструктор копирования - примеры

Первый раз конструктор вызывается для obj1. При создании объекта obj2 конструктор не вызывается, т.к. происходит побитное копирование obj1 в obj2. Это означает, что значение указателя ptr в обеих объектах одно и то же. При выходе из блока вызывается деструктор obj2, который освобождает память под переменную целого типа – сразу для двух объектов!
Так получилось, что в программе сразу после блока строится новый obj3, который в конструкторе получает тот же адрес памяти, который был освобожден – это и объясняет приведенный результат выполнения программы

Результат

#include

Слайд 27#include "iostream“
using namespace std;
class Cl {
public:
int *ptr;

Cl(int numb) { ptr = new int(numb); cout

}
~Cl() { delete ptr; cout << "Destructor\n"; }
void print () { cout << "*ptr = " << *ptr << endl; }
};

void main()
{
Cl obj1(5);
{
Cl obj2 = obj1; // Cl obj2 (obj1);
obj2.print();
}
Cl obj3(10);
obj1.print();
}

Конструктор копирования – примеры 2

Добавим:
Cl(const Cl & obj)
{
ptr = new int(*obj.ptr);
cout << "Copy constructor\n";
}


Результат

Эквивалентно !

#include

Слайд 28#include "iostream"

using namespace std;
class C {
int n;
public:
C(int numb)

{ n = numb; cout

& obj){ n = obj.n; cout << "Copy constructor\n"; }
~C() { cout << "Destructor\n"; }
void print () { cout << "n = " << n << endl; }
};

Конструктор копирования – примеры 3

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

Начало …

#include

Слайд 29
Cl fn()
{
cout

cout

<< "begin:main" << endl;
Cl obj1(5); obj1.print();
obj1 = fn(); obj1.print();
cout << "end:main" << endl;
}

Конструктор копирования – примеры 3

Результат

Окончание …

При вызове функции fn создается временный объект, предназначенный для хранения возвращаемого объекта.
Когда происходит инициализация временного объекта локальным объектом tmp внутри функции fn(), происходит вызов конструктора копирования.
После этого работают деструкторы для временного объекта и объекта tmp.
Значение временного объекта копируется в объект obj1 без вызовов конструктора копирования и деструктора.

Cl fn(){ cout

Слайд 30Тесты …
Вопрос: Скомпилируется ли следующий код:

class cls
{
public:
cls()

{ }
~ cls() { }
void f(cls

* p){ delete p; }
};

void main()
{
cls* p = new cls;
p->f(p);
}
Тесты …Вопрос: Скомпилируется ли следующий код: class cls{public:  cls() { }  ~ cls() { }

Слайд 31Тесты …
Вопрос: Скомпилируется ли следующий код:

class cls
{
public:
cls()

{ }
~ cls() { }
void f(cls

* p){ delete p; }
};

void main()
{
cls* p = new cls;
p->f(p);
}

Ответ «да».
Не смотря на то, что объект уничтожает сам себя. Метод f нормально отработает и будет вызван деструктор.

Тесты …Вопрос: Скомпилируется ли следующий код: class cls{public:  cls() { }  ~ cls() { }

Слайд 32Тесты …
Вопрос: Что выведет следующая программа:
#include "iostream"
#include

void main()
{

std::cout

Ошибка компиляции (stdio только в стандартной библиотеке языка С)

Ошибка компиляции (несоответствие типов)

Тесты …Вопрос: Что выведет следующая программа: #include

Слайд 33Тесты …
Вопрос: Что выведет следующая программа:
#include "iostream"
#include

void main()
{

std::cout

Ошибка компиляции (stdio только в стандартной библиотеке языка С)

Ошибка компиляции (несоответствие типов)

должно быть выведено "boom!5", т.к. printf() возвращает int, равный количеству символов, выведенных в stdout.
std::cout по умолчанию синхронизирован с stdout, поэтому вначале в stdout попадет "boom!", а затем - "5».


Тесты …Вопрос: Что выведет следующая программа: #include

Слайд 34Тесты …
Вопрос: Какое утверждение о следующем коде верно:

int main(int

argc, char* argv[])
{
int a[3] = { 1, 2, 3

};
int b[2] = { 1, 2 };
a = b;
return 0;
}

Варианты ответа:

Все нормально

Ошибка времени выполнения

Ошибка компиляции

Тесты …Вопрос: Какое утверждение о следующем коде верно: int main(int argc, char* argv[]){ int a[3] = {

Слайд 35Тесты …
Вопрос: Какое утверждение о следующем коде верно:

int main(int

argc, char* argv[])
{
int a[3] = { 1, 2, 3

};
int b[2] = { 1, 2 };
a = b;
return 0;
}

Варианты ответа:

Все нормально

Ошибка времени выполнения

Ошибка компиляции


error C2440: '=' : cannot convert from 'int [2]' to 'int [3]'

Тесты …Вопрос: Какое утверждение о следующем коде верно: int main(int argc, char* argv[]){ int a[3] = {

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

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

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

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

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


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

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