Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 14. Работа с классами 151
+= weightedGPA += hours * grade; gpa weightedGPA / semesterHours; return gpa; int main(int argcs, char* Students; Student t;
4.0); // Поставим ему 4 балла addCourse (3, 2.5); /'/ а этому дадим 2 с плюсом... return 0;
Когда addCourse () вызывается для объекта s, все сокращенные имена в теле этой функции считаются членами объекта s. Таким образом, обращение к переменной mesterHours внутри функции s . addCourse () в действительности является обращени- ем к переменной s. semesterHours, а обращение к gpa — обращением к s.gpa. В сле- дующей строке функции main (), когда addCourse () вызывается для объекта t того же класса Student, происходит обращение к членам класса t semesterHours и gpa.
Именование текущего объекта Как функция-член определяет, какой объект является текущим? Это не магия и не шаманство — просто адрес этого объекта всегда передается функции-члену как скрытый первый аргумент. Другими словами, при вызове функции-члена происхо- дит преобразование такого вида: равносильно 3, (команда, приведенная в правой части выражения, синтаксически неверна; это просто изображение того, как компилятор видит выражение в левой части во внут- реннем представлении). Соответственно внутри функции, когда нужно узнать, какой именно объект явля- ется текущим, используется этот указатель. Тип текущего объекта указатель на объект соответствующего класса. Всякий раз, когда функция-член обращается к другому члену класса, не называя имени его объекта явно, компилятор считает, что данный член является членом этого (this) объекта. При желании вы можете явно обращаться к членам этого объ- екта, используя ключевое слово this . Так что функцию Student : () можно переписать следующим образом: float hours, float grade) { float weightedGPA; weightedGPA this->semesterHours * this->gpa; // добавим новый курс hours; weightedGPA += hours * grade; this->gpa = weightedGPA / return this->gpa; } Независимо от того, добавите ли вы оператор this- > в тело функции явно или нет, результат будет одинаков.
152 Часть "Классическое" программирование Объект, для которого вызывается функция-член, называется "текущим", и все имена членов, записанные в сокращенном виде внутри счи- таются членами текущего объекта. Другими обращение к членам класса интерпретируется как обращение к членам текущего объекта.
Символ : : между именем класса и именем его члена называют оператором разреше- ния области видимости, поскольку он указывает, какой области видимости принадлежит член класса. Имя класса перед двоеточиями похоже на фамилию, тогда как название функции после двоеточия схоже с именем — такой порядок записи принят на востоке. Оператор : : можно использовать и для описания функции — не члена, вав для этого пустое имя класса. В этом случае функция () должна быть описана как : float) . Обычно оператор : : не обязателен, однако в некоторых ситуациях это не так. Рас- смотрим следующий фрагмент кода: // — перемножает количество часов и оценку grade) { retur n } clas s Studen t { public : in t floa t gpa ;
// пройденный курс к записи float hours, float grade) < // вызвать внешнюю функцию = (semesterHours, gpa); // вызвать ту же функцию для подсчета // оценки с учетом нового курса grade); gpa = weightedGPA / // вернуть новую оценку return gpa;
В этом фрагменте я хотел, чтобы функция-член Student : () вызывала функцию — не член : addCourse (). Без оператора : : вызов функции addCourse О внутри класса Student Приведет К функции Student : : addCourse () . Функция-член может использовать для обращения к другому члену класса сокращенное имя, подразумевающее использование имени текущего эк- земпляра класса.
В данном случае вызов функции без указания имени класса приводит к тому, что она вызывает саму себя. Добавление оператора : : в начале имени заставляет осущест- вить вызов глобальной версии этой функции (что нам и нужно): |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 236; Нарушение авторского права страницы