Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь