Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Топ:
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2020-05-08 | 187 |
5.00
из
|
Заказать работу |
Класс 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!