Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 14. Работа с классами 149
По историческим причинам функции-члены называют также метода- ми. Такое название имеет смысл в других объектно-ориентированных языках программирования, но бессмысленно в C++. Несмотря на это, термин приобрел некоторую популярность и среди программистов на C++ , наверное, поскольку его проще выговорить, чем выражение "функция-член" (то, что это звучит гораздо внушительнее, никого не волнует). Так что если во время вечеринки ваши друзья начнут сыпать словечками вроде "методы класса", просто мысленно замените "методы" выражением и все встанет на свои места. Поскольку термин "метод" смысла в C++ не имеет, я не буду исполь- зовать его в этой книге.
Именование членов класса Функция-член во многом похожа на члена семьи. Полное имя нашей функции float ) пишется как float) , так же как мое полное имя — Стефан Краткое имя этой функции — addCourse (int , float) , а мое краткое имя —- Стефан. Имя класса в начале полного имени означает, что эта функция является членом класса (: : между имена- ми функции и класса является просто символом-разделителем). Фамилия Дэвис после моего имени означает, что я являюсь членом семьи Существует и другое название полного имени — расширенное имя. Мы можем определить функцию addCourse (int , float) , которая не будет иметь ничего общего с классом Student; точно так же, как могут существовать люди с именем Стефан, которые не имеют ничего общего с моей семьей (это можно пони- мать и дословно: я знаю несколько Стефанов, которые не хотят иметь ничего общего с моей семьей). Вы можете создать функцию с полным именем Teacher: addCourse float ) или даже с именем Golf: addCourse float) . Имя addCourse (int , без имени класса означает, что это обычная функция, которая не является членом какого- либо класса.
Прежде чем вызывать функции-члены класса, вспомните, как мы обращались к данным-членам классов: class Student {
int float gpa; }; Student s; void { //обращение к данным-членам объекта s s . seinesterHours = 10; = 3.0; } Обратите внимание, что наряду с именем переменной необходимо указать имя объекта. Другими словами, приведенный ниже фрагмент программы не имеет смысла.
150 Часть "Классическое" программирование Student s; void
//этот пример ошибочен 10; / / член какого объекта какого класса? 10; // теперь ясно, какого класса, // однако до сих пор не ясно, // какого объекта
Обращение к функциям-членам Формально между данными-членами и функциями-членами нет никакого разли- чия, что видно из приведенного ниже фрагмента. Student void { //все приведенные команды обращаются к объекту s = = 3.0;
}
// вызов функции-члена Как видите, синтаксис вызова функции-члена такой же, как и синтаксис обраще- ния к переменной-члену класса. Часть выражения, которая находится справа от точ- ки, не отличается от вызова обычной функции. Единственное отличие — присутствие слева от точки имени объекта, которому принадлежит функция. Факт вызова этой функции можно озвучить так: "s является объектом, на который действует addCourse () или, другими словами, объект s представляет собой студен- та, к записи которого добавляется новый курс. Вы не можете получить информацию о студенте или изменить ее, не указав, о каком конкретно студенте идет речь. Вызов функции-члена без указания имени объекта имеет не больше смысла, чем обращение к данным-членам без указания объекта.
членам из Я так и слышу, как вы повторяете про себя: "Нельзя обратиться к функции-члену без указания имени объекта! Нельзя обратиться к функции-члену без указания имени объекта! Нельзя..." Запомнив это, вы смотрите на тело функции-члена : addCourse () и... что это? Ведь addCourse () обращается к членам не уточняя имени объекта! Возникает вопрос: все-таки можно или нельзя обратиться к члену класса, не указы- вая его обьекта? Уж поверьте мне, что нельзя. Просто, когда вы обращаетесь к члену класса Student из (), по умолчанию используется тот экземпляр класса, из которого вызвана функция addCourse (). Вы ничего не поняли? Вернемся к примеру:
float (int hours, float grade) { float weightedGPA; = semesterHours gpa; // добавим новый курс |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 180; Нарушение авторского права страницы