Объекты в качестве аргументов

Рассмотрим, каким образом исполняется программа ENGLC0N. Объекты distl и dist3 создаются при помощи конструктора по умолчанию (конструктора без аргу­ментов), а объект dist2 — при помощи конструктора, принимающего два аргумен­та, значения которых инициализируют поля объекта dist2. Значения для инициа­лизации объекта distl вводятся пользователем при помощи метода getdist().

Теперь мы хотим сложить значения distl и dist2 и присвоить результат объ­екту dist3. Это делается с помощью вызова функции

dist3.add_dist(distl. dist2):

Величины, которые мы хотим сложить, передаются в качестве аргументов методу add_dist(). Синтаксис передачи объектов в функцию такой же, как и для переменных стандартных типов: на месте аргумента указывается имя объекта. Поскольку add_dist() является методом класса Distance, он имеет доступ к любым полям любого объекта класса Distance, используя операцию точки (.), например distl.inches и dist2.feet.

Если внимательно изучить функцию add_dist(), то мы увидим несколько важ­ных деталей, касающихся методов класса. Методу класса всегда предоставлен доступ к полям объекта, для которого он вызван: объект связан с методом опе­рацией точки (.)• Однако на самом деле методу класса доступны и другие объ­екты. Если задаться вопросом, к каким объектам имеет доступ метод add_dist(), то, взглянув на вызов

dist3.add_dist(distl. dist2):

можно заметить, что, кроме объекта dist3, из которого был вызван метод add_ dist(), он имеет доступ также и к объектам distl и dist2, поскольку они выступа­ют в качестве его аргументов. Можно рассматривать объект dist3 как псевдоар-гумент функции add_dist(): формально он не является аргументом, но функция имеет доступ к его полям. Смысл приведенного вызова можно сформулировать так: «выполнить метод add_dist() объекта dist3». Когда внутри функции проис­ходит обращение к полям inches и feet, это означает, что на самом деле обраще­ние происходит к полям dist3.inches и dist3.feet.

Обратите внимание на то, что функция не возвращает значения. Типом воз­вращаемого значения для функции add_dist() является void. Результат автомати­чески присваивается объекту dist3. На рис. 6.6 приведена иллюстрация сложения значений distl и dist2 с сохранением результата в переменной dist3.

Подводя итог вышесказанному, мы можем утверждать, что каждый вызов метода класса обязательно связан с конкретным объектом этого класса (ис­ключением является вызов статической функции, как мы увидим позже). Метод может прямо обращаться по имени (feet и inches в данном примере) к любым, открытым и закрытым, членам этого объекта. Кроме того, метод имеет непря­мой (через операцию точки, например distl.inches и dist2.feet) доступ к членам других объектов своего класса; последние выступают в качестве аргументов метода.

Объекты, возвращаемые функцией

В примере ENGLC0N мы видели, что объекты можно передавать в функцию в каче­стве аргументов. Теперь мы рассмотрим, каким образом функция может возвра­тить объект в вызывающую программу. Мы модифицируем пример ENGLC0N и в результате получим программу ENGLRET:

// englret.срр

// возвращение функцией значения типа Distance

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

class Distance    // длина в английской системе

{

private:

       int feet;

       float inches;

public:       // конструктор без аргументов

Distance(): feet(0), inches(0.0)

{ }   // конструктор с двумя аргументами

Distance(int ft,float in): feet(ft),inches(in)

{ }

void getdist() // ввод длины

{

cout << "\nВведите число футов: ";

cin >> feet;

cout << "Введите число дюймов: ";

cin >> inches;

}

void showdist()   // вывод длины

{ cout << feet << "\'-" << inches << "\'"; }

Distance add_dist(Distance); // сложение

};

//         

// сложение данного объекта с d2. возврат суммы

Distance Distance::add_dist(Distance d2) {

Distance temp;    // временная переменная

temp.inches = inches + d2.inches; // сложение дюймов

if(temp.inches >= 12.0) // если сумма больше 12.0.

{      // то уменьшаем ее на

temp.inches -= 12.0;      // 12.0 и увеличиваем

temp.feet = 1;      // число футов на 1

}

temp.feet += feet + d2.feet;  // сложение футов

return temp;

}

//////////////////////////////////////////////////////////

int main()

{

setlocale(LC_CTYPE, "rus");

Distance dist1, dist3;     // две длины

Distance dist2(11, 6.25); // определение и инициализация dist2

dist1.getdist();      // ввод distl пользователем

dist3 = dist1.add_dist(dist2); // dlst3 - distl + dist2

// вывод всех'длин

cout << "\ndistl - ";

dist1.showdist();

cout << "\ndist2 - ";

dist2.showdist();

cout << "\ndist3 - ";

dist3.showdist();

cout << endl;

return 0;

}

Программа ENGLRET очень похожа на программу ENGLCON, однако различия между ними указывают на важные аспекты работы функций с объектами.

 

Аргументы и объекты

В примере ENGLCON два объекта были переданы в качестве аргументов в функ­цию add_dist(), а результат был сохранен в объекте dist3, методом которого и яв­лялась вызванная функция add_dist(). В программе ENGLRET в качестве аргумента в функцию add_dist() передается лишь один аргумент: объект dist2. dist2 складыва­ется с объектом distl, к которому относится вызываемый метод add_dist(), резуль­тат возвращается в функцию main()n присваивается объекту dist3:

dist3 = distl.add__dist(dist2):

Действия этого оператора аналогичны действиям соответствующего оператора программы ENGLCON, однако форма записи первого более естественна, поскольку использует операцию присваивания самым обычным образом.

 

Порядок выполнения работы

1. Изучите теоретический материал.

2. Напишите программу, согласно заданному в варианте задания условию.

3. Ответьте на контрольные вопросы.

 

ВАРИАНТЫ ЗАДАНИЙ

Выполнение заданий осуществите в следующем порядке:

· Прочтите постановку задачи.

· Сформулируйте алгоритм, используя псевдокод и нисходящую пошаговую детализацию.

· Напишите программу на С++.

· Проверьте, отладьте и выполните программу на С++.

Вариант. 1

Из-за высокой цены бензина водители озабочены затратами топлива своих автомобилей. Один водитель взял в рейс несколько емкостей бензина, записывая пройденные мили и бензин, использованный из каждой емкости. Разработайте программу на С++, которая вводила бы пробег в милях и бензин, использованный из каждой емкости. Программа должна рассчитывать и выводить на экран число миль на галлон для каждой емкости. После ввода исходных данных про­грамма должна рассчитать и напечатать значение среднего числа миль на галлон, полученное для всех емкостей. Пример вывода:

Введите расход бензина (-1, если ввод закончен) 12.8

Введите пройденный путь: 287

Для этой емкости получено миль / галлон 22.421875

Введите расход бензина (-1, если ввод закончен) 10.3

Введите пройденный путь: 200

Для этой емкости получено миль / галлон 19.417475

Введите расход бензина (-1, если ввод закончен) 5

Введите пройденный путь: 120

Для этой емкости получено миль / галлон 24.000000

Введите расход бензина (-1, если ввод закончен) -1

Средний расход бензина 21.601423

Вариант. 2

Разработайте программу на С++, которая будет определять, не пре­высили ли расходы клиента, имеющего депозитный счет, предела кредита. Для каждого клиента известны следующие данные:

1. Номер счета (целое).

2. Баланс с начала месяца.

3. Сумма всех расходов данного клиента в течение месяца.

4. Сумма всех приходов на счет данного клиента в течение месяца.

5. Допустимый размер кредита.

Программа должна ввести все эти данные, рассчитать новый баланс (равный начальному балансу + расход — приход) и определить, не превысил ли новый баланс предела кредита клиента. Для того кли­ента, чей кредит превышен, программа должна вывести на экран номер счета клиента, предел кредита, новый баланс и сообщение «Предел кредита превышен». Например:

Введите номер счета (-1, если ввод закончен) 100

Введите начальный баланс: 5394.78

Введите сумму расходов: 1000.00

Введите сумму прихода: 500.00

Введите предел кредита: 5500.00

Счет: 100

Предел кредита: 5500.00 Баланс: 5894.78 Предел кредита превышен

Введите номер счета (-1, если ввод закончен) 200

Введите начальный баланс: 1000.00

Введите сумму расходов: 123.45

Введите сумму прихода: 321.00

Введите предел кредита: 1500.00

Введите номер счета (-1, если ввод закончен) 300

Введите начальный баланс: 500.00

Введите сумму расходов: 274.73

Введите сумму прихода: 100.00

Введите предел кредита: 800.00

Введите номер счета (-1, если ввод закончен) -1

Вариант 3

Одна большая химическая компания платит своим продавцам на основе комиссионных. Продавец получает $200 в неделю плюс 9% от объема продаж за неделю. Например, продавец, который продал за неделю калий на $5000 получит $200 плюс 9% от $5000, то есть всего $650. Разработайте программу на С++, которая должна вводить для каждого продавца объем его продаж за последнюю не­делю, рассчитывать и выводить на экран его заработок. Данные вводятся поочередно для каждого продавца. Например:

Введите объем продаж в долларах (-1, если ввод закончен): 5000.00

Заработок: $650.00

Введите объем продаж в долларах (-1, если ввод закончен): 1234.56

Заработок: $311.11

Введите объем продаж в долларах (-1, если ввод закончен): 1088.89

Заработок: $298.00

Введите объем продаж в долларах (-1, если ввод закончен): -1

Вариант 4

Разработайте программу на С++, которая должна определять зара­ботную плату для каждого из нескольких служащих. Компания вы­плачивает каждому служащему повременную зарплату за первые 40 часов работы и выплачивает в полуторном размере за все рабочие часы сверх 40. Вам дан список сотрудников компании, число часов, отработанных каждым за последнюю неделю, и почасовая ставка каждого сотрудника. Программа должна ввести эти данные для каж­дого сотрудника, рассчитать и вывести на экран его суммарную зарплату. Например:

Введите число рабочих часов (-1, если ввод закончен) 39

Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $390.00

Введите число рабочих часов (-1, если ввод закончен) 40

Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $400.00

Введите число рабочих часов (-1, если ввод закончен) 41

Введите почасовую ставку работника ($00.00): 10.00 Зарплата: $415.00

Введите число рабочих часов (-1, если ввод закончен) -1

Вариант 5

Во многих компьютерных приложениях часто используется поиск максимального числа, (т.е. максимального из заданной группы чисел). Например, программа, которая определяет победителя со­ревнования продавцов, должна вводить объемы продаж каждого про­давца. Тот, у кого объем продаж выше, является победителем. На­пишите псевдокод программы, а затем и саму программу на С++, которая вводит последовательно 10 чисел, определяет наибольшее из них и печатает его значение. Подсказка: ваша программа должна использовать следующие три переменные:

counter: счетчик для счета до 10 (для хранения количества введен­ных чисел и определения момента, когда введены все 10 чисел), number: текущее введенное число, largest: максимальное найденное число.

Форма отчёта: отчет выполняется в текстовом редакторе в электронном виде.

Содержание отчета:

1. Тема работы.

2. Цель работы.

3. Выполненные задания.

 

Система оценки: пятибалльная.

 

Контрольные вопросы

1. Для чего необходимо определение класса?

2. В определении класса члены класса с ключевым словом private доступны:

а)   любой функции программы;

б)   в случае, если вам известен пароль;

в)   методам этого класса;

г)    только открытым членам класса.

3. Напишите определение класса leverage, включающего одно закрытое поле типа int с именем crowbar и одним открытым методом с прототипом void

4. Истинио ли следующее утверждение: поля класса должны быть закры­тыми?

5. Напишите оператор, создающий объект leverl класса leverage, онисанного в вопросе 4.

6. Операция точки (операция доступа к члену класса) объединяет следу­ющие два элемента (слева направо):

а)   член класса и объект класса;

б)   объект класса и класс;

в)   класс и член этого класса;

г)    объект класса и член этого класса.

7. Методы класса, определенные внутри класса, по умолчанию _____.

8. Конструктор вызывается автоматически в момент________объекта.

9. Имя конструктора совпадает с именем _______.

10. Напишите конструктор, который инициализирует нулевым значением по­ле crowbar класса leverage. Конструктор следует определить внутри определения класса.

11. Верно или неверно следующее утверждение: класс может иметь более од­ного конструктора с одним и тем же именем?

12. Методу класса всегда доступны данные:

а)   объекта, членом которого он является;

б)   класса, членом которого он является;

в)   любого объекта класса, членом которого он является;

г)    класса, объявленного открытым.

13. Классы полезны потому, что:

а)   не занимают памяти, если не используются;

б)   защищают свои данные от доступа со стороны других классов;

в)   собирают вместе все аспекты, касающиеся отдельной вещи;

г)    адекватно моделируют объекты реального мира.

14. Истинно ли следующее утверждение: существует простой, но очень точ­ный метод, позволяющий представлять решаемую задачу в виде совокуп­ности объектов классов?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: