Объекты в качестве аргументов функций — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

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

Объекты в качестве аргументов функций

2020-05-08 158
Объекты в качестве аргументов функций 0.00 из 5.00 0 оценок
Заказать работу

В следующей нашей программе мы внесем улучшения в пример 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.