►Перегрузка функций-членов...165
Функции-члены могут перегружаться так же, как и обычные функции ( обратитесь к главе 6, "Создание функций", если забыли, что это значит ). Как вы помните, имя класса является частью полного имени, и все приведённые ниже функции вполне корректны.
class Student
{
public :
/* grade — возвращает текущую среднюю оценку */
float grade( ) ;
/* grade — устанавливает новое значение оценки и возвращает предыдущее */
float grade( float newGPA )
/* ...прочие члены-данные... */
} ;
class Slope
{
public :
/* grade — возвращает снижение оценки */
float grade( ) ;
/* ...прочие члены-данные... */
} ;
/* grade — возвращает символьный эквивалент оценки */
char grade( float value ) ;
int main( int argcs , char* pArgs[ ] )
{
Student s ;
s.grade( 3.5 ) ; /* Student::grade( float ) */
float v = s.grade( ) ; /* Student::grade( ) */
char с = grade( v ) ; /* ::grade( float ) */
Slope o ;
float m = о.grade( ) ; /* Slope::grade( ) */
return 0 ;
}
_________________
165 стр. Глава 13. Работа с классами
Полные имена вызываемых из main( ) функций указаны в комментариях.
Когда происходит вызов перегруженной функции, составляющими её полного имени считаются не только аргументы функции, но и тип объекта, который вызывает функцию ( если она вызывается объектом ). Такой подход позволяет устранить неоднозначность при вызове функции.
В приведённом примере первые два вызова обращаются к функциям-членам Student::grade( float ) и Student::grade( ) соответственно. Эти функции отличаются списками аргументов. Вызов функции s.grade( ) обращается к Student::grade( ), поскольку тип объекта s — Student.
Третья вызываемая функция в данном примере — функция ::grade( float ), не имеющая вызывающего объекта. Последний вызов осуществляется объектом типа Slope, и соответственно вызывается функция-член Slope::grade( float ).
_________________
166 стр. Часть 3. Введение в классы
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ