Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Топ:
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2020-05-08 | 163 |
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): //вызывает второй конструктор
|
|
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!