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