Определение компонентных функций
Компонентная функция должна быть обязательно описана в теле класса. В отличие от обычных (глобальных) функций компонентная функция имеет доступ ко всем компонентам класса (с любым статусом доступа). Функция–компонент класса имеет ту же область видимости, что и класс, к которому она относится. Программист может влиять на компилятор, предлагая ему оформить ту или иную функцию как представляемую (встраиваемую). Для этих целей в определении функции указывается служебное слово (спецификатор) inline. При определении классов их компонентные функции также могут быть специфицированы как подставляемые. Кроме явного использования служебного слова inline для этого используется следующее соглашение. Если определение (не только прототип) принадлежит классу функции полностью размещено в классе (в теле класса), то эта функция по умолчанию считается подставляемой. Именно таким образом определены компонентные функции классов complex1, complex, stroka, использованных ранее в качестве примеров. Все функции перечисленных классов воспринимаются компьютером как подставляемые, то есть при каждом вызове этих функций их код «встраивается» непосредственно в точку вызова.
Но подставляемыми функциями могут быть не всякие функции. Подставляемая функция не может быть рекурсивной, не может содержать циклы, переключатели и т.д. Это ограничение весьма существенное, поэтому существует второй способ определения принадлежащих классу функций. Он состоит в том, что внутри тела класса помещается только прототип компонентной функции, а её определение – вне класса, как определение любой другой функции, входящей в программу. При таком внешнем определении компонентной функции она также может быть снабжена спецификатором inline, но при этом опять возникнут указанные ограничения, накладываемые на подставляемые функции.
При внешнем определении компонентной функции программист «должен сообщить» компилятору, к какому именно классу она относится. Для этого используется бинарная форма операции ‘::’ (указания области видимости).
Формат её использования в этом случае таков:
<имя класса> : : <имя компонентной функции>
Приведённая конструкция, называемая квалифицированным именем компонентной функции, означает, что функция есть компонент класса и лежит в области его действия. Именно такое определение привязывает функцию к классу и позволяет в её теле непосредственно использовать любые данные класса (его объектов) и любые принадлежащие классу функции (это относится и к собственным private- и к защищённым protected- компонентам).
При внешнем определении компонентной функции в теле класса помещается её прототип:
<тип> <имя функции> (<спецификация и инициализация параметров>);
Вне тела класса компонентная функция определяется таким образом:
<тип> <имя функции> (<спецификация формальных параметров>)
{
<тело, принадлежащее классу функции>
}
В качестве примера программу с использованием класса «вектор в двумерном пространстве».
Компонентные данные (свойства) класса: координаты вектора.
Компонентные функции (методы) класса:
1) ввод координат;
2) вывод координат;
3) определение длины вектора.
// VECT.H
class vect_2D
{
private:
float x, y;
public:
void get_x (float x1);
void get_y (float y1);
void print ();
float len ();
};
// Описание методов класса
void vect_2D : : get_x (float x1)
{ x=x1;} // Где x – компонент класса, x1 – передаваемое в get_x значение
void vect_2D : : get_y (float y1)
{ y=y1;}
void vect_2D : : print ()
{ printf (“{%f; %f}\n”, x, y); }
float vect_2D : : len ()
{
float z;
z=sqrt(x*x + y*Y);
return z;
}
Добавим этот объект класса в код программы, подключив проект «vect.h» в головном файле
#include “stdio.h”
#include “math.h”
#include “vect.h”
int main ( )
{
vect_2D v1, *v2;
float x, y, z;
v2=(vect_2D*) malloc (sizeof(vect_2D));
printf (“x=”); scanf (“%f”,&x);
printf (“y=”); scanf (“%f”,&y);
v1. get_x(x);
v1. get_y(y);
v2 – > get_x(x);
v2 – > get_y(y);
z=v1. print ( );
free (v2);
return 1;
}
Дата добавления: 2015-08-08; просмотров: 682;