Функции-члены класса
Концепция struct расширена в С ++ так, что функции могут быть членами структур. Объявление функции включается в объявление структуры и эта функция вызывается с использованием методов доступа, которые определены для членов структуры. Давайте перепишем наш пример ch_stack и объявим как функции-члены различные функции, связанные с
ch_stack.
struct ch_stack {
// представление данных
int top;
enum {max_len = 100, EMPTY = -1, FULL = max_len -1};
char s [max_len];
//операции, представленные как функции-члены
void reset ( ) {top = EMPTY; }
void push (char c) {top ++; s [top] = c;}
char pop ( ) {return s [top--];}
char top_of ( ) {return s [top]; }
bool empty ( ) {return (top = = EMPTY) ;}
bool full ( ) {return (top = = FULL) ;}
};
Функции-члены (member function) записаны подобно обычным функциям. Единственное отличие состоит в том, что они могут использовать имена членов класса « как есть ». Так, функции-члены ch_stack используют переменные top и s без явного указания имени структуры. При вызове функций-членов применительно к конкретному объекту типа ch_stack они действуют на указанные члены данных именно этого объекта.
Следующий пример иллюстрирует изложенные идеи. Пусть описаны две переменных типа ch_stack:
ch_stack data, operands;
тогда
data. reset ( ) ;
operands. reset ( ) ;
вызывают функцию-член reset, которая устанавливает data. top и operands. top в значение EMPTY. Если объявлен указатель на
ch_stack
ch_stack* ptr_operands = &operands;
то
ptr_operands -> push (‘A’);
вызывает функцию член push, которая приводит к приращению operands. top и устанавливает operands. s [top] в ‘A’.
Функции-члены, которые определены внутри struct, являются неявно встраиваемыми. Как правило, только короткие, интенсивно используемые функции-члены должны определяться внутри struct, как в только что приведенном примере. Чтобы определить функцию-член вне struct, используется оператор разрешения области видимости (scope resolution) . Перепишем наш пример, используя оператор разрешения области видимости. В этом случае функция уже не будет неявно встраиваемой.
struct ch_stack {
// предоставление данных
int top;
enum {max_len = 100, EMPTY = -1, FULL = max_len -1};
char s [max_len];
// операции, представленные как функции-члены
void reset ( ) {top = EMPTY; } //неявно встроенная функция
void push (char c) ; //прототип функции
…..
};
void ch_stack : : push (char c)//определение невстроенной функции
{
top ++;
s [top] = c;
}
Оператор разрешения области видимости позволяет функциям-членам из разных типов struct иметь одинаковые имена. То, какая именно функция-член вызывается, зависит от типа объекта, на который она направлена. Функции-члены внутри одной структуры могут быть перегружены.
struct ch_stack {
…..
char pop (int n); // в пределах ch_stack
…..
};
char ch_stack : : pop (int n)
{
while (n-- > 1)
top--;
return s [top--]
}
Что конкретно будет вызвано, зависит от текущих аргументов функции pop:
data. pop ( ); // вызывает стандартный рор
data. pop (5); // вызывает многократный рор
Объявление
ch_stack s, t, u;
создает три отдельных объекта ch_stack размером в
sizeof (ch_stack) байт. Каждая из этих переменных имеет свои собственные члены данных:
int top;
char s [max_len];
Функция-член по определению является частью типа. Не существует отдельной функции-члена для каждой из этих трех переменных ch_stack..
Спецификация inline может использоваться явно с функциями-членами, определенными в пределах области видимости файла.
struct ch_stack {
…..
void reset ( )
void push (char c) ;
…..
};
inline void ch_stack : : reset ( )
{
top = EMPTY;
}
inline void ch_stack : : push (char c)
{
s [++ top] = c;
}
Объединение операций с данными подчеркивает их «объективность».
