Программирование >>  Инициализация объектов класса, структура 

1 ... 195 196 197 [ 198 ] 199 200 201 ... 395


class Screen { public:

void home() { cursor = 0; } char get() { return screen[ cursor]; } char get( int, int ); void move( int, int ); bool checkRange( int, int ); int height() { return height; } int width() { return width; }

...

для Screen такой набор состоит из следующих объявленных в нем функций-членов:

Хотя у любого объекта класса есть собственная копия всех данн1х-членов, каждая

Screen myScreen, groupScreen; myScreen.home();

функция-член существует в единственном экземпляре:

groupScreen.home();

При вызове функции home() для объекта myScreen происходит обращение к его члену cursor. Когда же эта функция вызывается для объекта groupScreen, то она обращается

class Screen { public:

int height() { return height; } int width() { return width; }

...

private:

short heigh, width;

...

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

s2->height() можно переписать так:

(*s2).height()

Результат будет одним и тем же.

13.3. Функции-члены класса

Функции-члены реализуют набор операций, применимых к объектам класса. Например,



class Screen {

public:

для объявления встроенн функций-членов inline void home() { cursor = 0; }

inline гЬят- гто П I т-on т-n чгт-оопТ rrarr

использование кочевого слова inline для объявления встроенн функций-чле

inline char get() { return screen[ cursor]

...

типом возвращаемого значения ключевое слово inline: };

Определения home() и get() в приведенных примерах эквивалентны. Поскольку ключевое слово inline избыточно, мы в этой книге не пишем его явно для функций-членов, определенных в теле класса.

Функции-члены, состоящие из двух или более строк, лучше определять вне тела. Для идентификации функции как члена некоторого класса требуется специальный синтаксис объявления: имя функции должно быть квалифицировано именем ее класса. Вот как

#include <iostream> #include screen.h

имя функции-члена квалифицировано именем Screen:: bool Screen::checkRange( int row, int col ) { проверить корректность координат if ( row < 1 row > height col < 1 col > width ) { cerr << Screen coordinates ( << row << , << col << ) out of bounds.\n ; return false;

return true;

выглядит определение функции checkRange() , квалифицированное именем Screen:

Прежде чем определять функцию-член вне тела класса, необходимо объявить ее внутри тела, обеспечив ее видимость. Например, если бы перед определением функции checkRange() не был включен заголовочный файл Screen.h, то компилятор выдал бы сообщение об ошибке. Тело класса определяет полный список его членов. Этот список не может быть расширен после закрытия тела.

к члену cursor именно этого объекта, причем сама функция home() одна и та же. Как же может одна функция-член обращаться к данным-членам разных объектов? Для этого применяется указатель this, рассматриваемый в следующем разделе.

13.3.1. Когда использовать встроенные функции-члены

Обратите внимание, что определения функций home() , get() , height() и width() приведены прямо в теле класса. Такие функции называются встроенными. (Мы говорили об этом в разделе 7.6.)

Функции-члены можно объявить в теле класса встроенными и явно, поместив перед



inline void Screen::move( int r, int c )

{ переместить курсор в абсолютную позицию

if ( checkRange( r, c ) ) позиция на экране задана корректно? {

int row = (r-1) * width; смещение начала строки cursor = row + c - 1;

член класса Screen:

class Screen {

public:

inline char get( int, int );

объявления других функций-членов не изменяются

Функция get(int, int) объявляется встроенной с помощью слова inline: Определение функции следует после объявления класса. При этом слово inline можно

char Screen::get( int r, int c )

move( r, c ); устанавливаем cursor return get(); вызаем друг функцию-член get()

опустить:

Так как встроенные функции-члены должны быть определены в каждом исходном файле, где они вызываются, то встроенную функцию, не определенную в теле класса, следует поместить в тот же заголовочный файл, в котором определен ее класс. Например, представленные ранее определения move() и get() должны находиться в заголовочном файле Screen.h после определения класса Screen.

13.3.2. Доступ к членам класса

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

в определении функции-члена могут быть обращения к любым членам класса, открытым или закрытым, и это не нарушает ограничений доступа;

когда функция-член обращается к членам класса, операторы доступа точка и стрелка не необходимы.

Обычно функции-члены, определенные вне тела класса, не делают встроенными. Но объявить такую функцию встроенной можно, если явно добавить слово inline в объявление функции внутри тела класса или в ее определение вне тела, либо сделав то и другое одновременно. В следующем примере move() определена как встроенная функция-



1 ... 195 196 197 [ 198 ] 199 200 201 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика