Программирование >>  Аргументация конструирования 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 108


Микроволновая печь имеет свои внутренние компоненты, которые знают , как разморозить и приготовить продукты или сделать картошку хрустящей. Данные-члены

класса схожи с элементами микроволновой печи, а функции-члены - с программами приготовления.

Когда я делаю закуску, я не должен начинать приготовление с подключения внутренних элементов микроволновой печи. И я хочу, чтобы мои классы работали так же, т.е. чтобы они без всякого внешнего вмешательства знали, как управлять своими внутренними органами . Конечно, такие функции-члены класса 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;

добавим новый курс



1 ... 43 44 45 [ 46 ] 47 48 49 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика