Class monstr. void draw (int x, int y, int scale, int position);
{
int health, ammo;
public:
monstr(int he = 100, int am = 10)
{health = he; ammo = am;}
void draw (int x, int y, int scale, int position);
int get_health(){return health;}
int get_ammo(){return ammo;}
};
У цьому класі два приховані поля – health та ammo, набути значень яких ззовні можна за допомогою методів get_health() і get_ammo(). Всі методи класу мають безпосередній доступ до його прихованих полів. У приведеному класі міститься три визначення методів і одне оголошення (метод draw). Якщо тіло методу визначене усередині класу, він є вбудованим (inline). Як правило, вбудованими роблять короткі методи. Вбудовуємі функції можуть збільшити швидкість виконання програми, але непродумане їх використання може призвести до збільшення модуля до гігантських розмірів.
Якщо усередині класу записано тільки оголошення (заголовок) методу, сам метод має бути визначений у іншому місці програми за допомогою операції доступу до зони видимості (::):
void monstr::draw(int х,int у,int scale,int position)
{
/* тіло методу */
}
Метод можна визначити як вбудований і поза класом за допомогою директиви inline. У кожному класі є хоч би один метод, ім'я якого збігається з ім'ям класу. Він називається конструктором і викликається автоматично при створенні об'єкту класу. Конструктор призначений для ініціалізації об'єкту. Автоматичний виклик конструктора дозволяє уникнути помилок, зв'язаних з використанням неініціалізованих змінних.
1.2.2 Опис об’єктів
Конкретні змінні типу «клас» називаються екземплярами класу, або об'єктами. Час життя і видимість об'єктів залежить від виду і місця їх опису та підкоряється загальним правилам С++:
monstr Vasia; // Об'єкт класу monstr з параметрами за умовчанням
monstr Super(200, 300); // Об'єкт з явною ініціалізацією
monstr stado[100]; // Масив об'єктів з параметрами за умовчанням
monstr* beavis = new monstr (10); // Динамічний об'єкт
//(другий параметр задається за умовчанням)
monstr &butthead = Vasia; // Посилання на об'єкт
При створенні кожного об'єкту виділяється пам'ять, достатня для зберігання всіх його полів, і автоматично викликається конструктор, що виконує їх ініціалізацію. При виході об'єкту з області дії він знищується, при цьому автоматично викликається деструктор (деструктори описані далі).
Доступ до елементів об'єкту аналогічний доступу до полів структури. Для цього використовуються операція "." (крапка) при зверненні до елементу через ім'я об'єкту або операція "->" при зверненні через вказівку, наприклад:
int n = Vasia.get_ammo();
stado[5].draw(1,2,3,4);
cout << beavis->get_health();
Звернутися таким чином можна тільки до елементів із специфікатором рublic. Отримати або змінити значення елементів із специфікатором private можна тільки через звернення до відповідних методів. У нашому прикладі метод get_health(), що має специфікатор public, повертає значення поля health в секції private.
Можна створити константний об'єкт, значення полів якого змінювати забороняється. До нього повинні застосовуватися тільки константні методи:
class monstr
{
...
int get_health() const {return health;}
};
const monstr A(0,0); // Константний об'єкт
cout << A.get_health();
Константний метод:
– оголошується з ключовим словом const після списку параметрів;
– не може змінювати значення полів класу;
– може викликати тільки константні методи;
– може викликатися для будь-яких (не тільки константних) об'єктів.
Рекомендується описувати як константні ті методи, які призначені для набуття значень полів.
1.2.3 Вказівка this
Кожен об'єкт містить свій екземпляр полів класу. Методи класу знаходяться в пам'яті в єдиному екземплярі і використовуються всіма об'єктами спільно, тому необхідно забезпечити роботу методів з полями саме того об'єкту, для якого вони були викликані. Це забезпечується передачею у функцію прихованого параметра this, в якому зберігається константна вказівка на об'єкт, який викликав функцію. Вказівка thisнеявно використовується усередині методу для посилань на елементи об'єкту. У явному вигляді ця вказівка застосовується в основному для повернення з методу вказівки (return this;) або посилання (return *this;) на об'єкт. Для ілюстрації використання вказівки this додамо в приведений вище клас monstrновий метод, що повертає посилання на найбільшого (поле health) з двох монстрів, один з яких викликає метод, а інший передається йому як параметр (метод потрібно помістити в секцію public опису класу):
monstr & the_best(monstr &М)
{
if( health > М.health) return *this;
return M;
}
... monstr Vasia(50), Super(200);
// Новий об'єкт Best ініціалізувався значеннями полів Super:
monstr Best = Vasia.the_best(Super);
Вказівку thisможна також застосовувати для ідентифікації поля класу у тому випадку, коли його ім'я збігається з ім'ям формального параметра методу. Інший спосіб ідентифікації поля використовує операцію доступу до зони видимості:
Дата добавления: 2014-12-26; просмотров: 777;