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

«Расширенное имя функции включает в себя её аргументы. Теперь же мы добавляем к полному имени ещё и имя класса, к которому принадлежит функция.»
[ Помни! ]
►Определение функции-члена...162
Функция-член может быть определена как внутри класса, так и отдельно от него. Когда функция определяется внутри класса, это выглядит так, как в приведённом далее файле 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
#include
#include
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 заставляет препроцессор перед началом компиляции вставить вместо неё содержимое указанного в ней файла.»
Читать дальше