Детали изделия в качестве объектов — КиберПедия 

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Детали изделия в качестве объектов

2020-05-08 187
Детали изделия в качестве объектов 0.00 из 5.00 0 оценок
Заказать работу

Класс smallobj из предыдущего примера содержал только одно поле данных. Теперь мы рассмотрим более интересный пример.

// objpart.cpp

// детали изделия в качестве объектов

#include <iostream>

using namespace std;

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

class part // определение класса

{

private:

int modelnumber; // номер изделия

int partnumber; // номер детали

float cost; // стоимость детали

public:

// установка данных

void setpart(int mn, int pn, float c)

{

modelnumber = mn;

partnumber = pn;

cost = c;

}

void showpart()

    // вывод данных

{

cout << "Модель " << modelnumber;

cout << ". деталь " << partnumber;

cout << ". стоимость $" << cost << endl;

}

};

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

int main()

{

part part1; // определение объекта

// класса part

part1.setpart(6244, 373, 217.55F); // вызов метода

part1.showpart(); // вызов метода

return 0;

}

В этой программе используется класс part. В отличие от класса smallobj, класс part состоит из трех полей: modelnumber, partnumber и cost. Метод класса setpart() присваивает значения всем трем полям класса одновременно. Другой метод, showpart(), выводит на экран содержимое полей.

В примере создается единственный объект класса part с именем parti. Метод setpart() присваивает его полям значения соответственно 6244, 373 и 217.55. Затем метод showpart() выводит эти значения на экран. Результат работы програм­мы выглядит следующим образом:

Модель 6244. деталь 373. цена $217.55

Этот пример уже ближе к реальной жизни, чем SMALLOBJ. Если бы вы разра­батывали инвентаризационную программу, то, вероятно, создали бы класс, ана­логичный классу part. Мы привели пример объекта С++, моделирующего реаль­но существующий объект — комплектующие изделия.

Класс как тип данных

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

// englobj.cpp

// длины в английской системе в качестве объектов

#include <iostream>

using namespace std;

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

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

{

private:

int feet;

float inches;

public:

void setdist(int ft, float in) // установка значений полей

     { feet = ft;

        inches = in; }

  void getdist() // ввод полей с клавиатуры

     {

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

        cin >> feet;

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

        cin >> inches;

      }

     void showdist() // вывод полей на экран

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

       };

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

int main()

{

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

dist1.setdist(11,6.25); // установка значений для dl

dist2.getdist();  // ввод значений для dist2

// вывод длин на экран

cout << "\nd1stl - ";

dist1.showdist();

cout << "\ndist2 - ";

dist2.showdist();

cout << endl;

return 0;

}

В этой программе класс Distance содержит два поля: feet и inches. Он схож со структурой Distance, рассмотренной ранее, однако класс Distance имеет три метода: setdist(), предназначенный для задания значений полей объекта через передаваемые ему аргументы, getdist(), получающий эти же значения с клавиа­туры, и showdist(), отображающий на экране расстояние в футах и дюймах.

Таким образом, значения полей объекта класса Distance могут быть заданы дву­мя способами. В функции main() мы определили две переменные типа Distance: distl и dist2. Значения полей для первой из них задаются с помощью функции setdist(), вызванной с аргументами 11 и 6.25, а значения полей переменной dist2 вводятся пользователем. Результат работы программы выглядит следующим образом:

Введите число футов: 10 Введите число дюймов: 4.75

distl = 11’-6.25" - задано аргументами программы distl - 10'-4.75" - введено пользователем

 

Конструкторы

Пример ENGLOBJ демонстрирует два способа использования методов класса для инициализации полей объекта класса. Как правило, удобнее инициализи­ровать поля объекта автоматически в момент его создания, а не явно вызывать в программе соответствующий метод. Такой способ инициализации реализуется с помощью особого метода класса, называемого конструктором. Конструктор — это метод класса, выполняющийся автоматически в момент создания объекта.

Конструкторы класса

При создании объекта автоматически вызывается специальный метод, кото­рый называется конструктором (constructor). У конструктора имя класса и обязательно открытый спецификатор доступа. Конструктор управляет по­строением объекта в оперативной памяти. Процесс построения включает в себя выделение памяти для членов-данных типа указателей, а также ини­циализацию данных.

Конструктор никогда не возвращает никакого значения и не имеет типа, даже void. Конструктор перегружается, так как объекты можно инициализировать по-разному. Количество конструкторов практически не ограничивается и за­висит от целесообразности их наличия в классе. Однако существуют конст­рукторы, без которых не обойтись ни одному классу. Это конструктор по умолчанию, конструктор с параметрами и конструктор копирования.

Важно помнить, никакой конструктор не должен делать ничего, что касается обработки членов-данных. За обработку членов-данных несут ответствен­ность не конструкторы, а другие методы в классе.

Пример со счетчиком

В качестве примера мы создадим класс, объекты которого могут быть полезны практически для любой программы. Счетчик — это средство, предназначенное для хранения количественной меры какой-либо изменяющейся величины. Счетчик может хранить число обращений к файлу, число раз, которое пользователь нажал клавишу Enter, или количество клиентов банка. Как правило, при наступ­лении соответствующего события счетчик увеличивается на единицу (инкремен-тируется). Обращение к счетчику происходит, как правило, для того, чтобы уз­нать текущее значение той величины, для измерения которой он предназначен.

Допустим, что счетчик, который мы сейчас создадим, будет важной частью нашей программы, и многие из ее функций будут использовать значение этого счетчика. В процедурных языках, таких, как С, счетчик, скорее всего, был бы представлен в виде глобальной переменной. Но использование глобальных переменных усложняет разработку программы и не­безопасно с точки зрения несанкционированного доступа со стороны функций. Наш следующий пример, COUNTER, использует такой счетчик, значение которого может быть изменено только с помощью его собственных методов.

// counter.срр

// счетчик в качестве объекта

#include <iostream>

using namespace std;

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

class Counter

{

private:

unsigned int count; // значение счетчика

public:

Counter(): count(0) // конструктор

{ /* пустое тело */ }

void inc_count() // инкрементирование счетчика

  { count ++; }

int get _ count () // получение значения счетчика

   { return count; }

};

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

int main ()

{

Counter c 1, c 2; // определение с инициализацией

cout <<"\nc1-" << c1.get_count(); // вывод

cout << "\nc2=" << c2.get_count();

c 1. inc _ count (); // инкрементирование cl

c 2. inc _ count (); // инкрементирование c 2

c2.inc_count(); // инкрементирование c2

cout << "\ncl=" << c1.get_count(); // вывод

cout << "\nc2=" << c2.get_count();

cout << endl;

return 0;

}

Класс Counter имеет единственное поле count типа unsigned int, поскольку значение счетчика не может быть отрицательным, и три метода: конструктор Counter(), который мы рассмотрим чуть позже, inc_count(), инкрементирующий поле count, и get_count(), возвращающий текущее значение счетчика.


Поделиться с друзьями:

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

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.