Классы. Описание класса

Содержание

Слайд 2

Перегрузка функций
int fun(int i, int n=10)
{
return i*n;
}
double fun(double d, int n=10)
{
return d*double(n);
}

Перегрузка функций int fun(int i, int n=10) { return i*n; } double

Слайд 3

int i=20;
double d=4.44;
cout << fun(i) << endl;
cout << fun(i,20) << endl;
cout <<

int i=20; double d=4.44; cout cout cout cout
fun(d) << endl;
cout << fun(d,5.55) << endl;

Слайд 4

Классы. Описание класса

Константные методы класса
Рассмотрим пример.
class Test
{
int test_int;
double test_double;
public:
Test(){};
Test(int i, double

Классы. Описание класса Константные методы класса Рассмотрим пример. class Test { int
d): test_int(i), test_double(d){};

Слайд 5

Классы. Описание класса

void Out_const() const
{
cout << " Int: " << test_int <<

Классы. Описание класса void Out_const() const { cout } void Out() { cout } };
' ' << " Double: " << test_double << endl;
}
void Out()
{
cout << " Int: " << test_int << ' ' << " Double: " << test_double << endl;
}
};

Слайд 6

Здесь мы видим два одинаковых метода
void Out_const() const и void Out

Здесь мы видим два одинаковых метода void Out_const() const и void Out
(), первый из которых объявлен как константный. Его можно использовать по отношению к любым объектам класса, в том числе и к константным. Второй метод может использоваться только к не константным объектам.

Слайд 7

Классы. Описание класса

Например,
Test tst(10, 3.45);
const Test tst_const(20, 7.89);
tst. Out() ; // ok
tst. Out_const();

Классы. Описание класса Например, Test tst(10, 3.45); const Test tst_const(20, 7.89); tst.
// ok
tst_const.Out(); // error
tst_const. Out_const(); // ok

Слайд 8

Классы. Описание класса

sСуть ошибки в следующем:
test_const_meth.cpp(28): error C2662: Test::Show: невозможно преобразовать указатель

Классы. Описание класса sСуть ошибки в следующем: test_const_meth.cpp(28): error C2662: Test::Show: невозможно
"this" из "const Test" в "Test
Еще одно ограничение на константный метод – он не может менять значение полей класса.

Слайд 9

Классы. Описание класса

Например,
void Out_const() const
{
test_int = 333L; // error
cout << " Int:

Классы. Описание класса Например, void Out_const() const { test_int = 333L; // error cout }
" << test_int << ' ' << " Double: " << test_double << endl;
}

Слайд 10

Классы. Описание класса

Приведет к ошибке вида:
\test_const_meth.cpp(13): error C3490: "test_int" не может быть

Классы. Описание класса Приведет к ошибке вида: \test_const_meth.cpp(13): error C3490: "test_int" не
изменен, поскольку доступ к нему осуществляется через константный объект

Слайд 11

Классы. Описание класса

Значение полей константного объекта менять нельзя. В отдельных случаях, отдельные

Классы. Описание класса Значение полей константного объекта менять нельзя. В отдельных случаях,
поля все-таки изменить можно, описав их со спецификатором mutable.
Пересмотрим класс Test:
class Test
{
mutable int test_int; // изменяемое поле
double test_double;
public:
Test(){};

Слайд 12

Классы. Описание класса

Test(int i, double d): test_int(i), test_double(d){};
void Out_const() const
{
cout <<

Классы. Описание класса Test(int i, double d): test_int(i), test_double(d){}; void Out_const() const
" Int: " << test_int << ' ' << " Double: " << test_double << endl;
}
void Setter(int i) const // метод изменяющий поле
{
test_int = i;
}
};

Слайд 13

Классы. Описание класса

Пример использования:
const Test tst_const(20, 7.89);
tst_const.Out_const();
tst_const.Setter(200);
tst_const.Out_const();
Поле test_int объекта tst_const поменяет свое

Классы. Описание класса Пример использования: const Test tst_const(20, 7.89); tst_const.Out_const(); tst_const.Setter(200); tst_const.Out_const();
значение, попытка изменить значение другого объекта завершится ошибкой.
Безопасные функции относятся к привилегированным составляющим класса.

Слайд 14

Классы. Описание класса

Статические компоненты класса
Поле класса, объявленное со спецификатором static, называется статическим

Классы. Описание класса Статические компоненты класса Поле класса, объявленное со спецификатором static,
полем. Такое поле является общим для всех объектов данного класса и существует даже тогда, когда не создано ни одного объекта данного класса.
Инициализация статического поля глобального класса осуществляется с помощью отдельного инициализирующего объявления.

Слайд 15

Классы. Описание класса

Статические поля могут выполнять роль флажков условия, указателями на программу

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

Слайд 16

Классы. Описание класса

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

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

Слайд 17

Классы. Описание класса

Для дальнейших рассуждений рассмотрим еще один класс:
class Students
{
string Name;
int Age;
public:
Students(){};
Students(string

Классы. Описание класса Для дальнейших рассуждений рассмотрим еще один класс: class Students
name, int age):Name(name), Age(age){};
void Show()
{
cout << " Name: " << Name << ' ' << " Age: " << Age << endl;
}
};

Слайд 18

Классы. Описание класса

Объявим несколько объектов данного класса:
Students st_1("Ivan",20), st_2("Mary",20), st_3("Peter", 22);
Размер памяти,

Классы. Описание класса Объявим несколько объектов данного класса: Students st_1("Ivan",20), st_2("Mary",20), st_3("Peter",
необходимой для хранения объекта типа Students – 36 байт. Под каждый из объявленных объектов будет выделено ровно 36 байт. Попробуем представить себе «разрез» объектов внутри памяти машины.

Слайд 19

Классы. Описание класса

Классы. Описание класса

Слайд 20

Классы. Описание класса

Поля Name и Age будут выделены абсолютно всем объектам данного

Классы. Описание класса Поля Name и Age будут выделены абсолютно всем объектам
класса, сколько бы объектов не было объявлено. Несложно заметить, что значения этих полей индивидуально для каждого объекта.

Слайд 21

Классы. Описание класса

Такие поля в дальнейшем мы будем именовать экземплярными полями или

Классы. Описание класса Такие поля в дальнейшем мы будем именовать экземплярными полями
полями одного экземпляра. Они индивидуальны для каждого объекта и хранятся внутри объектов на все время существования объекта.
Что может общим для всех нескольких студентов?

Слайд 22

Классы. Описание класса

Объединяющим звеном для студентов может быть название (номер) группы, название

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

Слайд 23

Классы. Описание класса

Пересмотрим еще раз класс Students
class Students
{
string Name;
int Age;
public:
Students(){};
Students(string name, int

Классы. Описание класса Пересмотрим еще раз класс Students class Students { string
age):Name(name), Age(age){};

Слайд 24

Классы. Описание класса

static int Group; // статическое поле
void Show()
{
cout << " Name: "

Классы. Описание класса static int Group; // статическое поле void Show() { cout } };
<< Name << ' ' << " Age: " << Age << endl;
}
};

Слайд 25

Классы. Описание класса

Далее, вне тела какого-либо блока (в глобальной области) делаем инициализацию

Классы. Описание класса Далее, вне тела какого-либо блока (в глобальной области) делаем
статического поля:
int Students::Group = 4120;
Попытка сделать объявление внутри блока, например, в теле функции, приведет к ошибке. Еще одно важное замечание – со статическим полем можно работать даже в отсутствии объекта данного типа.

Слайд 26

Классы. Описание класса

Пример работы со статическим полем:
Students st_1("Ivan",20);
// без участия объекта
cout <<

Классы. Описание класса Пример работы со статическим полем: Students st_1("Ivan",20); // без
Students::Group << endl;
// через объект класса
cout << st_1.Group << endl;
Подобное обращение возможно, поскольку поле Group расположено в области public.

Слайд 27

Классы. Описание класса

Следующий момент связан с тем, посредством каких методов можно работать

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

Слайд 28

Классы. Описание класса

Они отличаются от обычных методов класса ключевым словом static.
Важное

Классы. Описание класса Они отличаются от обычных методов класса ключевым словом static.
замечание: статические методы не могут работать с нестатическими полями класса (!).

Слайд 29

Классы. Описание класса

Введем статический метод:
static void Show_static()
{
cout << " Group: " <<

Классы. Описание класса Введем статический метод: static void Show_static() { cout //cout
Group << endl;
//cout << Name << ' ' << Age << endl;
}
Попытка: cout << Name << ' ' << Age << endl; приведет к ошибке, в частности
(22): error C2597: недопустимая ссылка на нестатический член "Students::Name"

Слайд 30

Классы. Описание класса

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

Классы. Описание класса К статическому методу класса также можно обратиться даже без
объектов данного класса:
Students::Show_static();

Слайд 31

Классы. Описание класса

Не все составляющие функции класса могут быть объявлены как статические,

Классы. Описание класса Не все составляющие функции класса могут быть объявлены как
например, конструкторы, деструкторы, некоторые перегружаемые операторы.
А отдельные операции, в частности, операции new и delete по умолчанию считаются статическими.
Статические методы не могут быть константными и виртуальными.

Слайд 32

Классы. Описание класса

Особенности статических полей класса:
- память под статическое поле класса выделяется

Классы. Описание класса Особенности статических полей класса: - память под статическое поле
один раз при его инициализации не зависимо от числа объявленных объектов;
- статические поля доступны как через имя класса, так и через имя объекта;
- на статическое поле распространяется действие спецификатора private;

Слайд 33

Классы. Описание класса

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

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

Слайд 34

Классы. Описание класса

*Конструкторы класса
Инициализация полей объекта производится с помощью составной функции класса,

Классы. Описание класса *Конструкторы класса Инициализация полей объекта производится с помощью составной
называемой конструктором. Имя этой функции, задаваемой в неявно привилегированном виде, идентично имени класса, а ее идентификатор, как правило, перегружен. Это дает возможность для объектов данного класса

Слайд 35

Классы. Описание класса

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

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

Слайд 36

Классы. Описание класса

Если для какого-либо класса конструктор не определен, то для него

Классы. Описание класса Если для какого-либо класса конструктор не определен, то для
неявно (автоматически) определяется конструктор без параметров (по умолчанию).
Основные свойства конструкторов:
- конструктор не возвращает значение, даже на тип void. Нельзя получить указатель на конструктор (!);
- конструктор, вызываемый без параметров, называется конструктором по умолчанию;

Слайд 37

Классы. Описание класса

- конструкторы не наследуются;
- конструкторы нельзя описывать с модификаторами const,

Классы. Описание класса - конструкторы не наследуются; - конструкторы нельзя описывать с
virtual и static;
- параметры конструктора могут иметь любой тип, кроме типа определяемого класса. Можно задавать параметры по умолчанию (только один конструктор);

Слайд 38

Классы. Описание класса

- если в классе не задано ни одного конструктора, автоматически

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

Слайд 39

Классы. Описание класса

- конструкторы глобальных объектов вызываются до вызова функции main. Локальные

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

Слайд 40

Классы. Описание класса

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

Классы. Описание класса - конструктор вызывается, если в программе встретится какая-либо из
конструкций:
имя_класса имя_объекта [(сп. параметров)];
имя_класса (сп. параметров);
имя_класса имя_объекта = выражение;

Слайд 41

Классы. Описание класса

Рассмотрим пример класса с несколькими конструкторами.
class Test
{
int test_int;
string test_string;
public:
Test()
{ cout

Классы. Описание класса Рассмотрим пример класса с несколькими конструкторами. class Test {
<< " Конструктор без параметров " << endl;}

Слайд 42

Классы. Описание класса

Test(int i, string s)
{
test_int = i;
test_string = s;
cout <<

Классы. Описание класса Test(int i, string s) { test_int = i; test_string
" Конструктор с параметрами " << endl;
}
Test(int i)
{
test_int = i;
cout << " конструктор преобразования " << endl;
}

Слайд 43

Классы. Описание класса

void Show() const
{
cout << " Int: " << test_int <<

Классы. Описание класса void Show() const { cout } };
" String: " << test_string << endl;
}
};

Слайд 44

Классы. Описание класса

Возможные способы объявления и инициализации объектов класса Test:
Test tst_1;
Test tst_2(10);
Test

Классы. Описание класса Возможные способы объявления и инициализации объектов класса Test: Test
tst_3(20,"String");
Test(30);
В последнем случае создается безымянный объект со значением поля test_int = 30.

Слайд 45

Классы. Описание класса

Рекомендуется испытать программу и оценить результаты, это важно, потому что

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

Слайд 46

Классы. Описание класса

Конструктор со списком инициализации
Среди конструкторов следует выделить особенный случай конструктора

Классы. Описание класса Конструктор со списком инициализации Среди конструкторов следует выделить особенный
со списком инициализации.

Слайд 47

Классы. Описание класса

Классы. Описание класса

Слайд 48

Классы. Описание класса

Классы. Описание класса

Слайд 49

Классы. Описание класса

Классы. Описание класса

Слайд 50

Классы. Описание класса

Классы. Описание класса

Слайд 51

Классы. Описание класса

Классы. Описание класса

Слайд 52

Классы. Описание класса

Классы. Описание класса
Имя файла: Классы.-Описание-класса.pptx
Количество просмотров: 49
Количество скачиваний: 0