|
Кожен об'єкт класу має власну копію всіх змінних, оголошених усередині класу.
Приклад:
1. У якості першого простого приклада, розглянемо програму, у якій використовуєтьсяmyclass, описаний у тексті, для завдання значення а дляоb1 та ob2 і виводяться на екран ці значення для кожного об'єкту:
#include <iostream.h>
class myclass{(
// закрито для myclass
int a;
public:
void set_a(int num);
int get_a();
};
void myclass::set_a(int num)
{
a=num;
}
int myclass::get_a()
{
return a;
}
main()
{
myclass ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
cout «obl.get_a() «"\n'
cout «ob2.get_a() «"\n'
return 0;
}
Як і слідувало очікувати, програма виводить на екран величини 10 і 99.
2. У попередньому прикладі змінна а в myclass є закритою. Це означає, що вона безпосередньо доступна тільки для функцій членів myclass.(Це один з доводів на користь існування відкритої функції get_a().) Якщо ви спробуєте звернутися до закритого члена класу з тієї частини вашої програми, що не є членом цього класу, то результатом буде помилка при компіляції. Наприклад, припустимо, що myclass задано так, як показано в попередньому прикладі, тоді компіляція функції main() викликає помилку:
// Цей фрагмент містить помилку.
#include <iostream.h>
main()
{
myclass ob1, ob2;
ob1.a = 10; // ПОМИЛКА! до закритого члена немає
ob2.а = 99; // доступу для функції - не члена
cout «obl.get_a() «"\n";
cout «ob2.get_a() «"\n";
return 0;
}
3. Точно так само, як відкриті функції-члени, можуть існувати і відкриті змінні-члени. Наприклад, якби а була оголошена у відкритій секції myclass, тоді до неї, як показано нижче, можна було б звернутися з будь-якої частини програми:
#include <iostream.h>
class myclass {
public:
// тепер а відкрита
int a;
// і тепер не потрібні set a() і get a();
}
main()
{
myclass ob1, ob2;
// тут є явний доступ до а
оb1.а = 10;
ob2.а = 99;
cout «ob1.а «"\n";
cout «ob2.а «"\n";
return 0;
}
У цьому прикладі, оскільки а оголошена відкритим членомmyclass, до неї є явний доступ зmain() Зверніть увагу, як операція крапка (.) використовується для доступу до а. Звичайно, незалежно від того, чи викликаєте ви функцію-член, або здійснюєте доступ до перемінної-члена, за ім'ям об'єкта повинна випливати операція крапка (.), а за нею ім'я члена. Це необхідно для вичерпного визначення того, із членом якого об'єкта ви маєте справу.
4. Щоб оцінити можливості об'єктів, розглянемо більш практичний приклад. У цій програмі створюється класstack, що реалізує стек, який можна використовувати для збереження символів:
#include <iostream.h>
#define SIZE 10
// Оголошення класу stack для символів
class stack {
char stck[SIZE]; // містить стек
int tos; // індекс вершини стека
public:
void init(); // ініціалізація стека
void push(char ch); // поміщає в стек символ
char pop(); // виштовхує зі стека символ
};
// Ініціалізація стека
void stack::init()
{
tos=0;
}
// Приміщення символу в стек
void stack::push(char ch)
{
if (tos==S!ZE) {
cout «"Стек повний"
return;
}
stck[tos] = ch;
tos++;
}
// Виштовхування символу зі стека
char stack::pop()
{
if (tos==0) {
cout «"Стек порожній";
return 0; // повернення нуля при порожньому стеці
}
tos--;
return stck[tos];
}
main()
{
stack sl, s2; // створення двох стеків
int і;
// ініціалізація стеків
sl.init();
s2.init ();
sl.push('a');
s2.push('x');
sl.push('b');
s2.push('y');
sl.push('с');
s2.push('z');
for (і=0;і<3;і++) cout «"символ з sl:" «sl.pop() «"\n”;
for (і==0; і<3; і++) cout «"символ з s2: " «s2.pop() «"\n”;
return 0;
}
Ця програма виводить на екран наступне:
символ з sl: c
символ з sl: b
символ з sl: a
символ з s2: z
символ з s2: y
символ з s2: x
Давайте тепер детально проаналізуємо програму. Класstack містить дві закриті змінні:stck і tos. Масивstck фактично містить символи, що поміщаються в стек, atos містить індекс вершини стека. Відкритими функціями стека єinit(), push() і рор(), що, відповідно, ініціалізують стек, поміщають символ у стек і виштовхують його зі стека.
Усерединіmain() створюються дві стеки,sl і s2, і по три символи містяться в кожному з них.
Важливо розуміти, що один об'єкт (стек) не залежить від іншого. Тому символи, що поміщаються вsl, не мають способу впливати на символи, що поміщаються в s2. Кожен об'єкт містить свою власну копіюstck та tos. Це фундаментальна, для розуміння об'єктів, концепція. Хоча всі об'єкти класу мають загальні функції-члени, кожен об'єкт створює і підтримує свої власні дані.
Дата добавления: 2015-07-20; просмотров: 51 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Робота з файлами | | | Ключі доступу |