Програмування С, С++теорія та практика (частина 2)
2.5.2 Створення об’єктів. Доступ до полів та методів
Лише після створення змінної класу (екземпляру, об’єкту), що має тип класу, можна отримати доступ до даних та функцій, що належать класу. Оскільки елементи-дані та елементи-функції є частиною класу, звертання до них проводиться через оголошену змінну типу “клас”, подібно звертанню до елементів структури:
с1азз 1іпе { риЬ1іс:
іп£ х1, у1, х2, у2;
1іпе(іп£ _х1, іп£ _у1, іп^ _х2, іп£ _у2);
VОій зЬом();
VОій тоVе(іп^ х,іп£ у);
~1іпе () ;
};
//..............
VОій таіп()
{
// створюється об'єкт з класу Ііпе 1іпе з(12,43,33,43) ; іп£ 1оса1х, 1оса1у;
1оса1х=з.х1; //доступ до елементу-даних хі
1оса1у=з.у1; //доступ до елементу-даних у і
з.зЬом(); //доступ до елемента-функції зЬст();
}
Отже, доступ до членів класу здійснюється за допомогою оператору “крапка”(.) - оЬ]есґ.іїаґа. Цей оператор повідомляє про те, що потрібно забезпечити доступ до елементу класу сіаґа, змінна якого являє собою окремий його екземпляр - оЬ]есґ. Ясно, що виклик елемента-функції без вказівки екземпляра класу також неможливий. Синтаксис виклику такої функції нагадує суміш синтаксису доступу до елементів-даних та виклику звичайної функції - оЬ]есґ./ипк(). Кожний екземпляр класу має свою множину даних та функції-елементи працюють з окремим набором даних, що належить змінній.
Можливим є спосіб посилання на елемент даних об’єкту із використанням покажчика: с1азз з£
{
риЬ1іс: іп£ Ь;
£1оа£ д;
£1оа£ айй(іп£ Ь1, £1оа£ д1)
{
// ...
}
};
Vоій. зоте_£ип(з'Ь *рз)
{
рз->Ь=17; рз->д=3.00; рз->агігі(2,3);
}
зї з ;
іпї таіп^оігі.)
{
з оте_£ип(&з) ; геїигп 0;
}
Екземпляр, для якого викликається функція-елемент, є “поточним” та всі посилання на елементи-дані мають відношення саме до цього екземпляру, якщо не посилаються явно на інший екземпляр. Адреса екземпляру передається функції як неявний прихований аргумент, що має назву {кіз (цей, поточний). Цей тип завжди є покажчиком на екземпляр відповідного класу, що, зокрема, знаходить своє застосування при перевантаженні операцій. Кожного разу, коли функція-елемент посилається на елемент поточного класу без явної вказівки екземпляру, завжди вважається, що цей екземпляр {кіз:
сіазз гіето { сіазз гіето {
іпї і; іпї і;
риЬІіс: риЬІіс:
Vоій. 1оагі_і (іпї Vа1) { Vоігі 1оагі_і (іпї Vа1) {
£Ьі з - >і=Vа1; і=Vа1;
} }
Vоій. деї_і() Vоій. деї_і()
{ {
геїигп £Ьіз->і; геїигп і;
} }
}; };
Функції-елементи можуть перевантажуватися так, як і звичайні функції. Так як ім’я класу є частиною розширеного імені функції, є змога описати одну й ту ж функцію, але в різних протоколах класів. При активації такої перевантаженої функції для її ідентифікації використовуються не тільки аргументи, але й тип об’єкту, для якого вона викликається.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
