Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для шпор(печатаем 8 стр на листе).docx
Скачиваний:
1
Добавлен:
25.12.2019
Размер:
2.86 Mб
Скачать

1. Понятие класса. Методы класса. Управление доступом к компонентам.

! Класс — этот тип, определяемый пользователем. Альтернативные варианты: класс - это совокупность объектов, обладающих схожими свойствами и поведением, класс – это абстрактный тип данных, включающий множество компонент, среди которых имеется хотя бы одна функция.

! Функции, определённые внутри класса, называются методами этого класса.

Рассмотрим пример: допустим мы хотим научить нашего солдата ходить. Вот как это будет выглядеть при использовании структур:

struct soldier

{

int x, y;

};

soldier a = {0,0};

a.x += 1; // боец переместился вправо

Конечно же лучше для передвижения написать функцию:

void move (int x, int y) {}

А как должно выглядеть тело функции? Мы можем просто записать:

a.x += x;

a.y += y;

Но тогда, если у нас будет несколько переменных типа soldier, мы не сможем применить функцию move к ним. Поэтому нам необходимо передавать ещё один аргумент - структурную переменную чьи поля будут изменены. Итак:

soldier move (soldier a, int x, int y)

{

a.x += x;

a.y += y;

return a;

}

Теперь посмотрим, как рабоать с этой функцией:

soldier b = {0, 0};

soldier c = {1, 1};

b = move(b, 0, 1); // двигаем b вверх

c = move(c, 0, -1); // двигаем c вниз

В функцию передаётся переменная soldier, но её нужно и вернуть из функции. В функцию дополнительно передаётся 8 байт (поля x,y переменной soldier) и из функции возвращается восемь байт. Лучше конечно передавать soldier по ссылке.

Смотрите сколько сложностей! С классами всё намного проще:

class soldier

{

public:

int x,y;

void move (int dx, int dy)

{

x += dx;

y += dy;

}

};

Внутри функции мы определили функцию move. Заметьте, в неё не нужно передавать объекты класса - метод сам знает, какой объект его вызвал. dx и dy - значения на которые изменятся поля класса.

Как всё это работает:

soldier a = {0,0};

soldier b = {5,6};

a.move(1,1);

b.move(-2,3);

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

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

Ключ public разрешает использовать элементы класса любыми функциями программы.

Ключ private допускает использование элементов данных только функциями-членами (методами) класса.

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

В Class по умолчанию стоит private и он может быть опущен, а в struct – public.

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

Защита закрытых данных класса опирается на защиту имен членов класса. Такую защиту можно обойти с помощью манипуляции адресами и явного преобразования типов (то есть обманным путем). Защита C++ есть защита от непреднамеренных ошибок, а не от умышленного нарушения правил.