Функции-члены
Пользователям, по-видимому, понадобится широкий набор операций над объектами типа Screen: возможность перемещать курсор, проверять и устанавливать области экрана и рассчитывать его реальные размеры во время выполнения, а также копировать один объект в другой. Все эти операции можно реализовать с помощью функций-членов.
Функции-члены класса объявляются в его теле. Это объявление выглядит точно так же, как объявление функции в области видимости пространства имен. (Напомним, что глобальная область видимости – это тоже область видимости пространства имен. Глобальные функции рассматривались в разделе 8.2, а пространства имен – в разделе 8.5.) Например:
class Screen { public: void home(); void move( int, int ); char get(); char get( int, int ); void checkRange( int, int ); // ... |
};
Определение функции-члена также можно поместить внутрь тела класса:
class Screen { public: // определения функций home() и get() void home() { _cursor = 0; } char get() { return _screen[_cursor]; } // ... |
};
home() перемещает курсор в левый верхний угол экрана; get()
возвращает символ, находящийся в текущей позиции курсора.
Функции-члены отличаются от обычных функций следующим:
· функция-член объявлена в области видимости своего класса, следовательно, ее имя не видно за пределами этой области. К функции-члену можно обратиться с помощью одного из операторов доступа к членам – точки (.) или стрелки (->):
ptrScreen->home(); |
myScreen.home();
(в разделе 13.9 область видимости класса обсуждается более детально);
· функции-члены имеют право доступа как к открытым, так и к закрытым членам класса, тогда как обычным функциям доступны лишь открытые. Конечно, функции-члены одного класса, как правило, не имеют доступа к данным-членам другого класса.
Функция-член может быть перегруженной (перегруженные функции рассматриваются в главе 9). Однако она способна перегружать лишь другую функцию-член своего класса. По отношению к функциям, объявленным в других классах или пространствах имен, функция-член находится в отдельной области видимости и, следовательно, не может перегружать их. Например, объявление get(int, int) перегружает лишь get() из того же класса Screen:
class Screen { public: // объявления перегруженных функций-членов get() char get() { return _screen[_cursor]; } char get( int, int ); // ... |
};
(Подробнее мы остановимся на функциях-членах класса в разделе 13.3.)