Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Интересное:
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Дисциплины:
2020-05-08 | 158 |
5.00
из
|
Заказать работу |
|
|
В следующей нашей программе мы внесем улучшения в пример ENGL0BJ, а также продемонстрируем несколько новых аспектов создания классов: перегрузку конструкторов, определение методов класса вне класса и, возможно, самое важное — использование объектов в качестве аргументов функций. Рассмотрим программу ENGLC0N:
// englcon.cpp
// constructors.adds objects using member function
#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 << "'\'"; }
void add_dist(Distance, Distance); // прототип
};
// --
// сложение длин d2 и d3
void Distance::add_dist(Distance d2, Distance d3) {
inches = d2.inches + d3.inches; // сложение дюймов
feet =0; //с возможным заемом
if (inches >= 12.0) // если число дюймов больше 12.0.
{ //то уменьшаем число дюймов
inches -= 12.0; // на 12.0 и увеличиваем
feet ++; // число футов на 1
}
feet += d 2. feet + d 3. feet; // сложение футов
}
//////////////////////////////////////////////////////////
int main()
{
Distance dist1, dist3; // две длины
Distance dist2(11, 6.25); // определение и инициализация
dist1.getdist(); // ввод distl
dist3.add_dist(dist1,dist2); // dist3 = dist1 + dist2;
// вывод всех длин
cout << "\ ndistl = ";
dist1.showdist();
cout << "\ndist2 = ";
dist2.showdist();
cout << "\ndist3 = ";
dist3.showdist();
cout << endl;
return 0;
}
Основной блок этой программы начинается с присвоения начальных значений полям объекта dist2 класса Distance, после чего производится его сложение с экземпляром distl, инициализируемым пользователем. Затем на экран выводятся все три экземпляра класса Distance:
|
Введите число футов: 17
Введите число дюймов: 5.75
distl = 17'-5.75"
dist2 = 11’-6.25"
dist3 = 29'-0"
Рассмотрим теперь, как выполняются новые действия, включенные в программу.
Перегруженные конструкторы
Было бы удобно производить инициализацию переменных класса Distance в момент их создания, то есть использовать объявления типа
Distance width(5, 6.25):
где определяется объект width, сразу же инициализируемый значениями 5 и 6.25 для футов и дюймов соответственно.
Чтобы сделать это, вызовем конструктор следующим образом:
Distance(int ft, float in): feet(ft). inches(in)
{ }
Мы инициализируем поля feet и inches теми значениями, которые передаются конструктору в качестве аргументов.
Тем не менее, мы хотим сохранить возможность определять переменные класса Distance без инициализации, подобно тому, как мы делали в программе ENGL0BJ.
Distance distl. dist2:
В программе ENGL0BJ не было конструктора, но определения работали без ошибок. Почему же они работали без конструктора? Это объясняется тем, что компилятор автоматически встраивает в программу конструктор без параметров, который и создает переменные класса, несмотря на то, что явного определения конструктора мы не делали. Такой конструктор без параметров называется конструктором по умолчанию. Если бы конструктор по умолчанию не создавался автоматически, то мы не смогли бы определять переменные классов, в которых отсутствует конструктор.
Зачастую нам хотелось бы, чтобы начальные значения полям объекта присваивались также и в конструкторе без параметров. Если возложить эту функцию на конструктор по умолчанию, то мы не сможем узнать, какими значениями были инициализированы поля. Если же для нас важно, какими значениями будут инициализироваться поля объекта класса, то нам следует явно определить конструктор. В программе ENGLC0N мы поступаем подобным образом:
Distance(): feet(0). inches(0.0) //конструктор по умолчанию
{ } //тело функции пусто, никаких действий не производится
|
Члены класса инициализируются константными значениями, в данном случае целым значением 0 для переменной feet и вещественным значением 0.0 для переменной inches. Значит, мы можем использовать объекты, инициализируемые с помощью конструктора без параметров, будучи уверенными в том, что поля объекта имеют нулевые, а не другие, случайные, значения.
Теперь у нас имеется два явно определенных конструктора с одним и тем же именем Distance(), и поэтому говорят, что конструктор является перегруженным. Какой из этих двух конструкторов исполняется во время создания нового объекта, зависит от того, сколько аргументов используется при вызове:
Distance length: //вызывает первый конструктор
Distance width(11, 6.0): //вызывает второй конструктор
|
|
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!