Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Топ:
Оснащения врачебно-сестринской бригады.
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
|
из
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-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!