|
Программирование >> Аргументация конструирования
Микроволновая печь имеет свои внутренние компоненты, которые знают , как разморозить и приготовить продукты или сделать картошку хрустящей. Данные-члены класса схожи с элементами микроволновой печи, а функции-члены - с программами приготовления. Когда я делаю закуску, я не должен начинать приготовление с подключения внутренних элементов микроволновой печи. И я хочу, чтобы мои классы работали так же, т.е. чтобы они без всякого внешнего вмешательства знали, как управлять своими внутренними органами . Конечно, такие функции-члены класса Savings, как deposit (), могут быть реализованы и в виде внешние кций. Можно даже расположить все функции, необходимые для работы со счетами, в одном месте файла. Микроволновую печь можно заставить работать, соединив необходимые провода внутри нее, но я не хочу, чтобы мои классы (или моя микроволновая печь) работали таким образом. Я хочу иметь класс Savings, который буду использовать в своей банковской программе, не задумываясь над тем, какова его рабочая кухня . DoSaeUeHue ф1(ШсЩ1иНлена Эта процедура включает два аспекта: создание функции-члена и ее именование (звучит довольно глупо, не правда ли?). Создание функции-члена Чтобы продемонстрировать работу с функциями-членами, начнем с определения класса Student следующим образом: class Student ( public: int semesterHours; float gpa; добавить пройденный курс к записи float addCourse(int hours, float grade) { Вычисляем среднюю оценку с учетом времени различных курсов float weightedGPA; weightedGPA = semesterHours * gpa; новый курс semesterHours += hours; weightedGPA += grade * hours; gpa = weightedGPA / semesterHours; вернуть оценку return gpa; } Функция addCourse (int, float) является функцией-членом класса dent. По сути, это такое же свойство класса Student, как и свойства semesterHours и gpa. Для функций или переменных в программе, которые не являются членом какого-либо класса, нет специального названия, однако в этой книге я буду называть переменные или функции не членами класса, если они не б1ли явно описаны в составе какого-либо класса. По историческим причинам функции-члены называют также методами. Такое название имеет смысл в других объектно-ориентированных языках программирования, но бессмысленно в C + + . Несмотря на это, термин приобрел некоторую популярность и среди программистов на C++, наверное, поскольку его проще выговорить, чем выражение функция-член (то, что это звучит гораздо внушительнее, никого не волнует). Так что если во время вечеринки ваши друзья начнут сыпать словечками вроде методы класса , просто мыслеппо замените методы выражением функиии-члены , и все встанет на свои места. Поскольку термин метод смысла в C++ не имеет, я не буду использовать его в этой книге. Именование членов класса Функция-член во многом похожа на члена семьи. Полное имя нашей функции addCourse (int, float) пишется как Student:: addCourse (int, float), так же как мое полное имя - Стефан Дэвис. Краткое имя этой функции -addCourse (int, float), а мое краткое имя - Стефан. Имя класса в начале полного имепи означает, что эта функция является членом класса Student (: : между именами функции и класса является просто символом-разделителем). Фамилия Дэвис после моего имени означает, что я являюсь членом семьи Существует и другое название полного имени - расширенное имя. Мы можем определить функцию addCourse (int, float), которая не будет иметь ничего общего с классом Student; точно так же, как могут существовать люди с именем Стефан, которые не имеют ничего общего с моей семьей (это можно понимать и дословно: я знаю несколько Стефанов, которые не хотят иметь ничего общего с моей семьей). Вы можете создать функцию с полным именем Teacher: : addCourse (int, float) или даже с именем Golf: : addCourse (int, float). Имя addCourse (int, float) без имени класса означает, что это обычная функция, которая не является членом какого- либо класса. Прежде чем вызывать функции-члены класса, вспомните, как мы обращались к данным-членам классов: class Student public: int semesterHours; float gpa; 7 . Student s; void fn(void) обращение к данным-членам объекта s s . seines terHours = 10; s.gpa = 3.0; Обратите внимание, что наряду с именем переменной необходимо указать имя объекта. Другими словами, приведенный ниже фрагмент программы не имеет смысла. student s; void fn(void) ( этот пример ошибочен semesterHours = 10; / / член какого объекта и какого класса? Student::semesterHours = 10; теперь ясно, какого класса, однако до сих пор не ясно, какого объекта Обращение к функциям-членам Формально между данными-членами и функциями-членами нет никакого различия, что видно из приведенного ниже фрагмента. Student s; void fn(x-oid) все приведенные команды обращаются к объекту s = S.gpa = 3.0; s.addCourse (3, 4.0); вызов функции-члена Как видите, синтаксис вызова функции-члена такой же, как и синтаксис обращения к переменной-члену класса. Часть выражения, которая находится справа от точки, не отличается от вызова обычной функции. Единственное отличие - присутствие слева от точки имени объекта, которому принадлежит функция. Факт вызова этой функции можно озвучить так: s является объектом, на который действует addCourse () ; или, другими словами, объект s нредставляет собой студента, к записи которого добавляется новый курс. Вы не можете получить информацию о студенте или изменить ее, не указав, о каком конкретно студенте идет речь. Вызов функции-члена без указания имени объекта имеет не больше смысла, чем обращение к данным-членам без указания объекта. 2)oaH4fn ic членам из фlfШ(цuUЧJteнa Я так и слышу, как вы повторяете про себя: Нельзя обратиться к функции-члену без указания имени объекта! Нельзя обратиться к функции-члену без указания имени объекта! Нельзя... Заномнив это, вы смотрите на тело функции-члена Student: : addCourse () и... что это? Ведь addCourse () обращается к членам класса, не уточняя имени объекта! Возникает вопрос: все-таки можно или нельзя обратиться к члену класса, не указывая его обьекта? Уж поверьте мне, что нельзя. Просто, когда вы обращаетесь к члену класса Student из (), по умолчанию используется тот экземпляр класса, из которого вызвана функция addCourse (). Вы ничего не поняли? Вернемся к примеру: finclude student.h floa : addCourse (int hours, float grade) float weightedGPA; weightedGPA = semesterHours * gpa; добавим новый курс
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |