Переменная а.accountNumber отличается от переменной b.accountNumber. Эти переменные различаются между собой так же, как баланс моего банковского счёта отличается от вашего ( хотя они оба называются балансами ).
►Активизация объектов...154
Классы используются для моделирования реально существующих объектов. Чем ближе объекты С++ к реальному миру, тем проще с ними работать в программах. На словах это звучит довольно просто, однако существующий сейчас класс Savings не предпринимает ничего, чтобы хоть в чём-то походить на настоящий банковский счёт.
_________________
154 стр. Часть 3. Введение в классы
Моделирование реальных объектов...155
Реальные объекты имеют свойства-данные, например номера счетов и балансы. Но кроме этого, реальные объекты могут выполнять действия: микроволновые печи готовят, сберегательный счёт начисляет проценты, полицейский выписывает штраф и т.д.
Функционально ориентированные программы выполняют все необходимые действия с помощью функций. Программа на С++ может вызвать функцию strcmp( ) для сравнения двух строк или функцию getLine( ) для ввода строки. В главе 24, "Использование потоков ввода-вывода", будет показано, что даже операторы работы с потоками ввода-вывода ( cin >> и cout << ) являются не чем иным, как особым видом вызова функции.
Для выполнения действий классу Savings необходимы собственные активные свойства:
class Savings
{
public :
unsigned deposit( unsigned amount )
{
balance += amount ;
return balance ;
}
unsigned int accountNumber ;
float balance ;
} ;
В приведённом примере помимо номера и баланса счёта в класс Savings добавлена функция deposit( ). Теперь класс Savings может самостоятельно управлять своим состоянием. Так же, как класс MicrowaveOven ( микроволновая печь ) содержит функцию cook( ) ( готовить ), класс Savings содержит функцию deposit( ). Функции, определённые в классе, называются функциями-членами.
Зачем нужны функции-члены...155
Почему мы должны возиться с функциями-членами? Что плохого в таком фрагменте:
class Savings
{
public :
unsigned accountNumber ;
float balance ;
} ;
unsigned deposit( Savings& s , unsigned amount )
{
s.balance += amount ;
return s.balance ;
}
Ещё раз напомню: пока что не обращайте внимания на символ "&" — его смысл станет понятен позже.
В этом фрагменте deposit( ) является функцией "вклада на счёт". Эта функция поддержки реализована в виде внешней функции, которая выполняет необходимые действия с экземпляром класса Savings. Конечно, такой подход имеет право на существование, но он нарушает наши правила объектно-ориентированного программирования.
Микроволновая печь имеет свои внутренние компоненты, которые "знают", как разморозить и приготовить продукты или сделать картошку хрустящей. Данные-члены класса схожи с элементами микроволновой печи, а функции-члены — с программами приготовления.
_________________
155 стр. Глава 13. Работа с классами
Когда я делаю закуску, я не должен начинать приготовление с подключения внутренних элементов микроволновой печи. И я хочу, чтобы мои классы работали так же, т.е. чтобы они без всякого внешнего вмешательства знали, как управлять своими "внутренними органами". Конечно, такие функции-члены класса Savings, как deposit( ), могут быть реализованы и в виде внешних функций. Можно даже расположить все функции, необходимые для работы со счетами, в одном месте файла. Микроволновую печь можно заставить работать, соединив необходимые провода внутри неё, но я не хочу, чтобы мои классы ( или моя микроволновая печь ) работали таким образом. Я хочу иметь класс Savings, который буду использовать в своей банковской программе, не задумываясь над тем, какова его рабочая "кухня".
►Добавление функции-члена...156
Эта процедура включает два аспекта: создание функции-члена и её именование ( звучит довольно глупо, не правда ли? ).
Создание функции-члена...156
Чтобы продемонстрировать работу с функциями-членами, начнём с определения класса Student следующим образом:
class Student
{
public :
/* Добавить пройденный курс к записи */
float addCourse( int hours , float grade )
{
/* Вычислить среднюю оценку с учётом времени различных курсов */
float weightedGPA ;
weightedGPA = semesterHours * gpa ;