►Разрешение области видимости...161

We use cookies. Read the Privacy and Cookie Policy

Символ :: между именем класса и именем его члена называют оператором разрешения области видимости, поскольку он указывает, какой области видимости принадлежит член класса. Имя класса перед двоеточиями похоже на фамилию, тогда как название функции после двоеточия схоже с именем — такой порядок записи принят на востоке.

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

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

    /* addCourse — перемножает количество часов и оценку */

    float addCourse( int hours , float grade )

    {

        return hours * grade ;

    }

    class Student

    {

    public :

        int semesterHours ;

        float gpa ;

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

        float addCourse( int hours , float grade )

        {

            /* Вызвать внешнюю функцию */

            weightedGPA = addCourse( semesterHours , gpa ) ;

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

            weightedGPA += addCourse( hours , grade ) ;

            gpa = weightedGPA / semesterHours ;

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

            return gpa ;

        }

    } ;

В этом фрагменте я хотел, чтобы функция-член Student::addCourse( ) вызывала функцию — не член ::addCourse( ). Без оператора :: вызов функции addCourse( ) внутри класса Student приведёт к вызову функции Student::addCourse( ).

«Функция-член может использовать для обращения к другому члену класса сокращённое имя, подразумевающее использование имени текущего экземпляра класса.»

[Помни!]

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

    /* addCourse — перемножает количество часов и оценку */

    float addCourse( int hours , float grade )

    {

        return hours*grade ;

    }

_________________

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

    class Student

    {

    public :

        int semesterHours ;

        float gpa ;

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

        float addCourse( int hours , float grade )

        {

            /* Вызвать внешнюю функцию */

            weightedGPA = ::addCourse( semesterHours , gpa ) ;

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

            weightedGPA += ::addCourse( hours , grade ) ;

            gpa = weightedGPA / semesterHours ;

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

            return gpa ;

        }

    } ;

Это похоже на то, как если бы я звал Стефана в собственном доме. Все решили бы, что я зову самого себя: ведь в моём доме, естественно, подразумевается фамилия Дэвис. Если же я имею в виду какого-то другого Стефана, то должен сказать "Стефан Спупендайк" или "Стефан Мак-Суини" либо использовать какую-нибудь другую фамилию. Так же действует и оператор разрешения области видимости.

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

 [Помни!]