Объектно-ориентированное программирование

s = sv; // инициализировать масть
r = rv; // инициализировать ранг

faceup = true; // начальное положение — картинкой вверх

}

int card::rank()

{

return r;

}

Тело метода записывается как стандартная функция языка C, но имени метода предшествует имя класса и два двоеточия. На переменные экземпляра(поля данных класса) можно ссылаться внутри метода как на обычные переменные. Комбинация имени класса и имени метода образует полное имя, она может рассматриваться как аналог имени и фамилии при идентификации личности.

Чтобы вдохновить программистов использовать такие принципы разработки программ как абстрагирование и инкапсуляция, язык программированияC++ предоставляет им возможность определять встраиваемые функции. Для того кто к ней обращается,

 

встраиваемая функция выглядит точно так же, как и обычная, с теми же самыми синтаксическими правилами для задания аргументов. Единственная разница состоит в том, что компилятор имеет право преобразовать вызов встраиваемой функции непосредственно в код в точке ее вызова, сокращая тем самым расходы на обращение к функции и возврат управления. (Как и в случае директивыregister, inline-реализацияявляется пожеланием, компилятор имеет право его проигнорировать.)

inline int Card::rank()

{

return r;

}

Абстрагирование и инкапсуляция часто способствуют появлению большого количества функций, которые выполняют незначительную часть работы и, следовательно, имеют небольшой размер. Определяя их как встраиваемые функции, программист может

сохранить выгоды инкапсуляции и избежать затрат на вызов функций во время выполнения. Хотя чрезмерное внимание к эффективности может быть вредным с точки зрения разработки надежного кода, программисты часто болезненно воспринимают ситуацию, когда тело функции состоит только из одинокого оператораreturn. Это означает, что вызов функции может занять больше времени, чем выполнение ее тела. С помощью встраиваемых функций этих проблем можно избежать. Если такая функция определяется в открытой интерфейсной части описания класса, то и все определение встраиваемой функции задается в интерфейсном файле, а не в файле реализации.

Листинг 3.7. Описание класса сard сinline-методами, языкC++

//абстракция игральной карты

//язык программирования: C++

//автор: Тимоти Бадд, 1995 class card

{

public:

//конструкторы

card (suits, int); card ();

card (const card & c);

// доступ к атрибутам карты

int rank() {return r;}
suits suit()
{return s;}
colors color();
bool faceUp() {return faceup;}
//выполняемые действия
void draw (window & w, int x, int y);
void halfdraw (window & w, int x, int y);
void flip()
{faceup = ! faceup;}
private:
bool faceup; // ранг
int r;
suits s; // масть
};

Как следует из ее названия, встраиваемая функция будет встроена в код. Таким образом, вызова функции(с точки зрения машинного кода) не произойдет. С другой стороны, часто возникает множество копий тела функции, так что встраивание следует использовать для

 

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

При интенсивном использовании встраиваемых функций вполне реально, что файл реализации окажется короче файла с интерфейсом.

Встраиваемые функции также можно определять, задавая тело функции непосредственно внутри определения класса(см. листинг3.7). Однако это приводит к тому, что