Типы данных в языке C++________________________________721

Реализация функций записи и чтения может иметь вид:

void MyClass::SetA(int Value)
{

if(...)       // проверка корректности данных
FA = Value;

)

int MyClass::GetA(void) {return FA;)

В данном случае функция чтения просто возвращает значение поля, но в более
сложных классах может потребоваться какая-то предварительная обработка дан-
ных. Обратите внимание, что все описания функций — элементов содержат ссыл-
ку на класс с помощью операции разрешения области действия (::).

В приведенном примере объявление класса содержит только прототипы функ-
ций, а их реализация вынесена из описания класса. Для простых функций реали-
зация может быть размещена непосредственно в объявлении класса. Например:

class MyClass

{

public:

MyClass(int = 0);

void SetA(int Value) {FA= Value;};   // функция записи

int GetA(void) (return FA;);         // функция чтения
private:

int FA;

double B, C;

);

Функции, описание которых содержится непосредственно в объявлении клас-
са, в действительности являются встраиваемыми функциями inline (см. главу 11
раздел 11.5.6, в котором обсуждаются достоинства и недостатки таких функций).

Введение описания функций в объявление класса — это плохой стиль про-
граммирования: следует избегать смещения открытого интерфейса класса, содер-
жащегося в его объявлении, и реализации класса. Если уж вы хотите реализовать
встраиваемые функции, то лучше поместить в объявлении класса их прототип со
спецификатором inline:

inline void SetA(int);   // функция записи
и отдельно дать реализацию функции. При этом в реализации спецификатор inline

Хороший стиль программирования ————————————————————————

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

Функции — элементы класса имеют доступ к любым другим функциям — эле-
ментам и к любым данным — элементам, как открытым, так и закрытым. Клиен-
ты класса (какие-то внешние функции, работающие с объектами данного класса)
имеют доступ только к открытым функциям — элементам и данным — элементам.
Но в некоторых случаях желательно обеспечить доступ к закрытым элементам для
функций, не являющихся элементами данного класса. Это можно сделать, объя-
вив соответствующую функцию как друга класса с помощью спецификации fri-
end. Например, если в объявление класса включить оператор

friend void IncFA(MyClass *);