Выбрать главу

Мы можем определить функцию addCourse( int , float ), которая не будет иметь ничего общего с классом Student ; точно так же, как могут существовать люди с именем Стефан, которые не имеют ничего общего с моей семьёй ( это можно понимать и дословно: я знаю несколько Стефанов, которые не хотят иметь ничего общего с моей семьёй ).

Вы можете создать функцию с полным именем Teacher::addCourse( int , float ) или даже с именем Golf::addCourse( int , float ). Имя addCourse( int , float ) без имени класса означает, что это обычная функция, которая не является членом какого-либо класса.

«Расширенное имя функции, не являющейся членом какого-либо класса, имеет вид ::addCourse( int , float )

[Советы]

►Вызов функций-членов...157

Прежде чем вызывать функции-члены класса, вспомните, как мы обращались к данным-членам классов:

    class Student

    {

    public :

        int semesterHours ;

        float gpa ;

    } ;

    Student s ;

    void fn( void )

    {

        /* Обращение к данным-членам объекта s */

        s.semesterHours = 10 ;

        s.gpa = 3.0 ;

    }

_________________

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

Обратите внимание, что наряду с именем переменной необходимо указать имя объекта. Другими словами, приведённый ниже фрагмент программы не имеет смысла.

    Student s ;

    void fn( void )

    {

        /* Этот пример ошибочен */

        semesterHours = 10 ;

            /* Член какого объекта и какого класса? */

        Student::semesterHours = 10 ;

            /* Теперь ясно, какого класса, однако до сих пор не ясно, какого объекта */

    }

Обращение к функциям-членам...158

Формально между данными-членами и функциями-членами нет никакого различия. Следующая программа показывает, как можно использовать функцию-член addCourse( ).

    /* CallMemberFunction — определение и вызов */

    /*                         функции-члена класса */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    class Student

    {

        public :

            /* Добавить пройденный курс к записи */

            float addCourse( int hours , float grade )

            {

                /* Вычислить среднюю оценку с учётом времени различных курсов */

                float weightedGPA ;

                weightedGPA = semesterHours * gpa ;

                /* Добавить новый курс */

                semesterHours += hours ;

                weightedGPA += grade * hours ;

                gpa = weightedGPA / semesterHours ;

                /* Вернуть новую оценку */

                return gpa ;

            }

            int semesterHours ;

            float gpa ;

    } ;

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

_________________

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

    {

        Student s ;

        s.semesterHours = 10 ;

        s.gpa = 3.0 ;

        /* Значения до вызова */

        cout << "До: s = ( " << s.semesterHours

                << ", " << s.gpa

                << " )" << endl ;

        s.addCourse( 3 , 4.0 ) ; /* Вызов функции-члена */

        /* Изменённые значения */

        cout << "После: s = ( " << s.semesterHours

                << ", " << s.gpa

                << " )" << endl ;

        /* Обращение к другому объекту */

        Student t ;