Выбрать главу

 b = i*i; // прямое обращение к переменной b

}

int myclass::geta()

{

 return a; // прямое обращение к переменной а

}

void myclass::reset()

{

// Прямой вызов функции setab()

setab(0); // для уже известного объекта.

}

int main()

{

 myclass ob;

 ob.setab(5); // Устанавливаем члены данных ob.a и ob.b.

 cout << "Объект ob после вызова функции setab(5): ";

 cout << ob.geta() << ' ';

 cout << ob.b; // К члену b можно получить прямой доступ, поскольку он является public-членом.

 cout << '\n';

 ob.b = 20; // Член b можно установить напрямую, поскольку он является public-членом.

 cout << "Объект ob после установки члена ob.b=20: ";

 cout << ob.geta() <<' ';

 cout << ob.b;

 cout << '\n';

 ob.reset();

 cout << "Объект ob после вызова функции ob.reset(): ";

 cout << ob.geta() << ' ';

 cout << ob.b;

 cout << '\n';

 return 0;

}

При выполнении этой программы получаем следующие результаты.

Объект ob после вызова функции setab(5): 5 25

Объект ob после установки члена ob.b=20: 5 20

Объект ob после вызова функции ob.reset(): 0 0

Теперь рассмотрим, как осуществляется доступ к членам класса myclass. Прежде всего обратите внимание на то, что для присвоения значений переменным а и b в функции setab() используются следующие строки кода.

а = i; // прямое обращение к переменной а

b = i*i; // прямое обращение к переменной b

Поскольку функция setab() является членом класса, она может обращаться к членам данных а и b того же класса непосредственно, без явного указания имени объекта (и не используя оператор "точка"). Как упоминалось выше, функция-член всегда вызывается для определенного объекта (а коль вызов состоялся, объект, стало быть, известен). Таким образом, в теле функции-члена нет необходимости указывать объект вторично. Следовательно, ссылки на переменные а и b будут применяться к копиям этих переменных, относящимся к вызывающему объекту.

Теперь обратите внимание на то, что переменная b — открытый (public) член класса myclass. Это означает, что к b можно получить доступ из кода, определенного вне тела класса myclass. Следующая строка кода из функции main(), при выполнении которой переменной b присваивается число 20, демонстрирует реализацию такого прямого доступа.

ob.b = 20; // К члену b можно получить прямой доступ.

// поскольку он является public-членом.

Поскольку эта инструкция не принадлежит телу класса myclass, то к переменной b возможен доступ только с использованием конкретного объекта (в данном случае объекта ob) и оператора "точка".

Теперь обратите внимание на то, как вызывается функция-член reset() из функции main().

ob.reset();

Поскольку функция reset() является открытым членом класса, ее также можно вызвать из кода, определенного вне тела класса myclass, и посредством конкретного объекта (в данном случае объекта ob).

Наконец, рассмотрим код функции reset(). Тот факт, что она является функцией-членом, позволяет ей непосредственно обращаться к другим членам того же класса, не используя оператор "точка" или конкретный объект. В данном случае она вызывает функцию-член setab(). И снова-таки, поскольку объект уже известен (он используется для вызова функции reset()), нет никакой необходимости указывать его еще раз.

Здесь важно понять следующее: когда доступ к некоторому члену класса происходит извне этого класса, его необходимо квалифицировать (уточнить) с помощью имени конкретного объекта. Но код самой функции-члена может обращаться к другим членам того же класса напрямую.