►Определение функции-члена...162

We use cookies. Read the Privacy and Cookie Policy

Функция-член может быть определена как внутри класса, так и отдельно от него. Когда функция определяется внутри класса, это выглядит так, как в приведённом далее файле Savings.h:

    /* Savings — определение класса с возможностью делать вклады */

    class Savings

    {

        public :

            /* Объявляем и определяем функции-члены */

            float deposit( float amount )

            {

                balance += amount ;

                return balance ;

            }

            unsigned int accountNumber ;

            float balance ;

    } ;

Использование такого заголовочного файла проще простого — его надо включить в программу и пользоваться определённым в нём классом, как вам заблагорассудится, например, как в приведённой далее программе SavingsClassInline.

_________________

162 стр. Часть 3. Введение в классы

    /* SavingsClassInline — вызов фукции-члена, объявленной и определённой в классе Savings */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    #include " Savings.h "

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

        /* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

        setlocale (LC_ALL,".1251");

        Savings s ;

        s.accountNumber = 123456 ;

        s.balance = 0.0 ;

        /* Добавляем немного на счёт... */

        cout << "Вкладываем на счёт 10 монет"

                << s.accountNumber << endl ;

        s.deposit( 10 ) ;

        cout << "Состояние счёта "

                << s.balance << endl ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    }

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

«Директива #include заставляет препроцессор перед началом компиляции вставить вместо неё содержимое указанного в ней файла.»

[Помни!] 

«Встраиваемые функции-члены

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

Есть ещё одна техническая причина, по которой функции-члены класса лучше делать встраиваемыми. Как вы помните, все структуры языка С обычно определяются в составе включаемых файлов с последующим использованием в исходных .срр-файлах при необходимости. Такие включаемые файлы не должны содержать данных или тел функций, поскольку могут быть скомпилированы несколько раз. Использование же подставляемых функций во включаемых файлах вполне допустимо, поскольку их тела, как и макросы, подставляются вместо вызова в исходном файле. То же относится и к классам С++. Подразумевая, что функции-члены, определённые в описании классов, встраиваемые, мы избегаем упомянутой проблемы многократной компиляции.»

[Технические подробности]

_________________

163 стр. Глава 13. Работа с классами