С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 103
Текст из файла (страница 103)
Такие функции называются встроенными. (Мы говорилиоб этом в разделе 7.6.)Функции-члены можно объявить в теле класса встроенными и явно, поместив передclass Screen {public:// использование ключевого слова inline// для объявления встроенных функций-членовinline void home() { _cursor = 0; }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, то компилятор выдал бысообщение об ошибке. Тело класса определяет полный список его членов. Этот список неможет быть расширен после закрытия тела.595С++ для начинающихОбычно функции-члены, определенные вне тела класса, не делают встроенными. Нообъявить такую функцию встроенной можно, если явно добавить слово inline вобъявление функции внутри тела класса или в ее определение вне тела, либо сделав то идругое одновременно. В следующем примере move() определена как встроенная функция-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 );// устанавливаем _cursorreturn get();// вызываем другую функцию-член get()опустить:}Так как встроенные функции-члены должны быть определены в каждом исходном файле,где они вызываются, то встроенную функцию, не определенную в теле класса, следуетпоместить в тот же заголовочный файл, в котором определен ее класс. Например,представленные ранее определения move() и get() должны находиться в заголовочномфайле Screen.h после определения класса Screen.13.3.2. Доступ к членам классаГоворят, что определение функции-члена принадлежит области видимости классанезависимо от того, находится ли оно вне или внутри его тела.
Отсюда следуют двавывода:•в определении функции-члена могут быть обращения к любым членам класса,открытым или закрытым, и это не нарушает ограничений доступа;•когда функция-член обращается к членам класса, операторы доступа “точка” и“стрелка” не необходимы.596С++ для начинающих#include <string>void Screen::copy( const Screen &sobj ){// если этот объект и объект sobj - одно и то же,// копирование излишне// мы анализируем указатель this (см. раздел 13.4)if ( this != &sobj ){_height = sobj._height;_width = sobj._width;_cursor = 0;// создаем новую строку;// ее содержимое такое же, как sobj._screen_screen = sobj._screen;}Например:}Хотя _screen, _height, _width и _cursor являются закрытыми членами класса Screen,функция-член copy() работает с ними напрямую.
Если при обращении к членуотсутствует оператор доступа, то считается, что речь идет о члене того класса, для#include "Screen.h"int main(){Screen s1;// Установить s1Screen s2;s2.copy(s1);// ...которого функция-член<b>Текст обрезан, так как является слишком большим</b>.