Именование текущего объекта...160
«Как функция-член определяет, какой объект является текущим? Это не магия и не шаманство — просто адрес этого объекта всегда передаётся функции-члену как скрытый первый аргумент. Другими словами, при вызове функции-члена происходит преобразование такого вида:
s.addCourse( 3 , 2.5 ) равносильно Student::addCourse( &s , 3 , 2.5 )
( команда, приведённая в правой части выражения, синтаксически неверна; она просто показывает, как компилятор видит выражение в левой части во внутреннем представлении ).»
[Технические подробности]
Внутри функции, когда нужно узнать, какой именно объект является текущим, используется этот указатель. Тип текущего объекта — указатель на объект соответствующего класса. Всякий раз, когда функция-член обращается к другому члену класса, не называя имени его объекта явно, компилятор считает, что данный член является членом этого ( this ) объекта. При желании вы можете явно обращаться к членам этого объекта, используя ключевое слово this. Так что функцию Student::addCourse( ) можно переписать следующим образом:
float Student::addCourse( int hours , float grade )
{
float weightedGPA ;
weightedGPA = this -> semesterHours * this -> gpa ;
/* добавим новый курс */
this -> semesterHours += hours ;
weightedGPA += hours * grade ;
this -> gpa = weightedGPA / this -> semesterHours ;
return this -> gpa ;
}
Независимо от того, добавите ли вы оператор this -> в тело функции явно или нет, результат будет одинаков.
_________________
160 стр. Часть 3. Введение в классы
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ