Именование текущего объекта...160

We use cookies. Read the Privacy and Cookie Policy

«Как функция-член определяет, какой объект является текущим? Это не магия и не шаманство — просто адрес этого объекта всегда передаётся функции-члену как скрытый первый аргумент. Другими словами, при вызове функции-члена происходит преобразование такого вида:

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. Введение в классы