Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
EKZAMEN_PO_INFORMATIKE_TEORIYa_1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
260.1 Кб
Скачать

23)Классы. Описание класса. Описание объекта. Константные методы. Указатель this.

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

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

Описание класса:

class Имя_Класса

{[private:]

// Описание скрытых элементов

...

public:

// Описание доступных элементов

...}; // Описание заканчивает точкой с запятой

Правила описания полей класса:

- поля могут иметь любой тип, кроме типа этого же класса

- поля могут быть описаны модификатором const или static, но не как auto, extern и register

- инициализация для полей при описании не допускается

Пример класса:

class monstr

{// Закрытые элементы класса (поля)

int health, ammo;

// Открытый программный интерфейс класса (методы)

public:

monstr(int he=100, int am=10)

{health=he; ammo=am;}

int get_health() {return health;}

int get_ammo() {return ammo;}

void draw(int x, int y, int scale, int position);};

Внешнее определение метода

void monstr:: draw(int x, int y, int scale, int position)

{/* тело метода */}

// встраиваемый метод

inline int monstr:: get_ammo()

{return ammo;}

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

Переменные типа "класс" называются экземплярами или объектами

monstr m;

monstr Super (200, 300);

monstr stado[100];

monstr km1=new monstr(10);

monstr &m2=Super;

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

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

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

int n=m.get_ammo();

stado[5].draw(10,10,1,1);

cout<<m1->get_health();

Константные объекты и методы.

Значения полей константного объекта изменять запрещается. К нему должны применяться только константные методы.

class mostr

{...

int get_health() const {return health} };

const monstr Dead(0,0); // константный объект

cout<<Dead.get_health();

Константный метод сам может вызывать только константные методы, но может вызываться для любых (не только константных) объектов.

Указатель this

this - указатель на объект, который вызвал метод класса.

monstr& monstr:: TheBest(monstr &M)

{if (health>M.health) return *this;

else return M;}...

monstr Vasia(50), Super(200);

monstr Best=Vasia.TheBest(Super);

Обращение к полю класса через this

void monstr:: Cure(int health, int ammo)

{this->health+=health;

this->ammo+=ammo;}

24)Конструкторы. Конструктор копирования. Статические элементы класса.

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

Основные свойства конструкторов:

- конструктор не возвращает значение, даже типа void

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

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

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

Свойства конструкторов:

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

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

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

Пример перегрузки конструктора:

class monstr

{char *name;

...

public:

...

monstr (char *nam)

{name=new char[strlen(nam)+1];

strcpy(name, nam);

health=100; ammo=10;}};

...

monstr x(100);

monstr y("Ork");

Список инициализаторов:

monstr:: monstr(int he, int am)

: health(he), ammo(am)

{/* тело конструктора */}

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

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

T:: T(const T&)

{/* тело конструктора */}

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

- при описании нового объекта с инициализацией другим объектом

- при передаче объекта в функцию по значению

- при возврате объекта из функции

Пример конструктора копирования:

monstr:: monstr(const monstr &m)

{if (M.name != NULL)

{ name=new char[strlen(M.name+1)];

strcpy(name, M.name);}

else name=NULL;

health=M.health; ammo=M.ammo;}

monstr Super;

monstr Vasia=Super; // работает конструктор копирования

monstr *m=new monstr("Ork");

monstr x=*m; // работает конструктор копирования

Статически элементы класса.

Статические поля класса инициализируются в глобальной области с указанием имени класса и операции доступа к области видимости:

class A

{public:

static int count; // Объявление в классе};

...

int A:: count=10; // Определение в глобальной области

Статические поля доступа как через имя класса, так и через имя объекта:

A *a, b;

cout<<A::count<<a->count<<b.count;

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

Статические методы:

Могут применяться или для обращения к статическим полям или просто как глобальные функции.

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

Пример:

class ABC

{static int count;

public:

static void int_count() {count ++;}};

int ABC:: count;

void func()

{ABC var; // var.count++ - нельзя

var.int_count(); } // или ABC:: int_count();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]