13.1.2. Функции-члены
13.1.2. Функции-члены
Пользователям, по-видимому, понадобится широкий набор операций над объектами типа 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.)