Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абстрактные классы.rtf
Скачиваний:
6
Добавлен:
10.07.2019
Размер:
2.25 Mб
Скачать

2.1.5. Реализация конструктора

Конструктор может быть определен как inline или вне тела класса. Например, следующий код определяет конструктор Rectangle:

Rectangle::Rectangle(float 1, float w)

{

length = l;

width = w;

}

C++ предоставляет специальный синтаксис для инициализации членов класса. Список инициализации членов (member initialization list) — это список имен данных-членов класса, разделенных запятыми, за каждым из которых следует начальное его значение, заключенное в скобки. Начальные значения обычно являются параметрами конструктора, которые присваиваются соответствующим данным-членам класса в списке. Список инициализации членов помещается после заголовка функции и отделяется от списка параметров двоеточием:

ClassName::ClassName(parm list):data1(parm1),..., datan(parmn)

Например, параметры конструктора l и w могут быть присвоены данным-членам класса length и width:

Rectangle::Rectangle(float l, float w): length(l), width(w)

{}

2.1.6. Создание объектов

Один объект может использоваться для инициализации другого в каком-либо объявлении. Например, следующий оператор является правильным:

Rectangle square(10, 10), yard = square, S;

Объект square создается с length и width, равными 10. Второй объект yard создается с начальными данными, копируемыми из объекта square. Объект S имеет length и width, по умолчанию равными 0.

Объекты могут свободно присваиваться один другому. Если только пользователь не создает пользовательский оператор присваивания, присваивание объекта может выполняться побитовым копированием данных-членов класса. Например, присваивание

S = yard;

копирует все данные из объекта yard в объект S. В этом случае length и width объекта yard копируются в length и width объекта S.

Объект может быть создан ссылкой на его конструктор. Например, объявление Rectangle(10,5) создает временный объект с lengh = 10 и width = 5. В следующем операторе операция присваивания копирует данные из временного объекта в rectangle S:

S = Rectangle(10,5);

Пример 2.

1.Операторы

S = Rectangle(10,5);

cout << S.Area() << endl;

приводят к выводу в поток cout числа 50.

2.Оператор

cout << Rectangle(10,5).GetWidth() << endl;

Выводит число 5.

Программа 1. Использование класса Rectangle

В этой программе вычисляется относительная стоимость отделочных работ передней стороны гаража. Пользователь задает размеры передней стороны гаража, а программа выдает различные размеры и стоимость двери. Пользователь замечает, что при выборе большей двери требуется меньше материала для обшивки и опалубки для кладки бетона. Учитывая стоимость пиломатериалов большая дверь может быть более экономичной.

Предположим, что опалубка проходит по периметру передней стороны и периметру проема двери. Мы запрашиваем у пользователя размер передней стороны гаража и затем вводим цикл, позволяющий выбрать размер двери. Цикл заканчивается, когда пользователем выбирается опция "Quit". Для каждого выбора двери программа определяет стоимость отделки передней стороны гаража и выводит это значение. Мы задаем константами стоимость деревянной обшивки $2 за кв. фут и стоимость опалубки на $0,50 за погонный фут.

О палубка

Д верь

О бшивка

Длина опалубки равна сумме периметров передней стороны гаража и двери. Стоимость обшивки равна площади передней стороны гаража минус площадь двери.

//Example1.срр

#include <iostream.h>

class Rectangle

{

private:

// длина и ширина прямоугольного объекта

float length, width;

public:

// конструктор

Rectangle(float l=0, float w = 0);

// методы для получения и модификации закрытых данных

float GetLength(void) const;

void PutLength(float 1);

float GetWidth (void) const;

void PutWidthffloat w) ;

//вычисление характеристик прямоугольника

float Perimeter (void) const;

float Area(void) const;

}

//конструктор, выполняет присваивания: length=l, width=w

Rectangle:: Rectangle(float l, float w): length(l), width(w)

{}

// возвратить длину прямоугольника

float Rectangle:: GetLength(void) const

{

return length;

}

//изменить длину прямоугольника

void Rectangle:: PutLength(float l)

{

length = l;

}

// возвратить ширину прямоугольника

float Rectangle:: GetWidth(void) const

{

return width;

}

// изменить ширину прямоугольника

void Rectangle:: PutWidth(float w)

{

width = w;

}

// вычислить и возвратить периметр прямоугольника

float Rectangle:: Perimeter(void) const

{

return 2.0*(length + width) ;

}

//вычислить и возвратить площадь прямоугольника

float Rectangle:: Area(void) const

{

return length*width;

}

void main(void)

{

//стоимости обшивки и опалубки - постоянные

const float sidingCost = 2.00, moldingCost = 0.50;

int completedSelections = 0;

//опция из меню, выделенная пользователем

char doorOption;

//длина/ширина и стоимость двери

float glength, gwidth, doorCost;

//общая стоимость, включая дверь, обшивку и опалубку

float totalCost;

cout << "Введите длину и ширину гаража: ";

cin >> glength >> gwidth;

//создать объект garage(гараж) с размерами по умолчанию

// создать объект door(дверь) с размерами по умолчанию

Rectangle garage(glength, gwidth);

Rectangle door;

while (!completedSelections)

{

cout << "Введите 1-4 или 'q' для выхода" << endl << endl;

cout << "Дверь 1 (12х8; $380) "

cout << "Дверь 2 (12x10; $420) "<<endl;

cout << "Дверь 3 (16x8; $450) "

cout << "Дверь 4 (16 x10; $480)" << endl;

cout << endl;

cin >> doorOption;

if(doorOption == 'q')

completedSelections = 1;

else

switch (doorOption)

{

case '1':door.PutLength(12); // 12 x 8 ($380)

door.PutWidth(8) ;

doorCost = 380;

break;

case '2':door.PutLength (12) ; // 12 x 10 ($420)

door.PutWidth(10);

doorCost = 420;

break;

case '3':door.PutLength (16) ; // 16 x 8 ($450)

door.PutWidth(8);

doorCost = 450;

break;

case '4':door.PutLength (12) ; //16x10 ($480)

door.PutWidth(10);

doorCost = 480;

break;

}

totalCost=doorCost+moldingCost*(garage.Perimeter()+

door.Perimeter())+sidingCost* (garage.Area()-door.Area());

cout <<"Общая стоимость двери, обшивки и опалубки:$" <<

totalCost << endl << endl;

}

}

}

/*

<Запуск программы 3.1>

Введите длину и ширину гаража: Введите 1-4 или 'q' для выхода

Дверь 1 (12х8; $380) Дверь 2 (12х10; $420)

Дверь 3 (16х8; $450) Дверь 4 (16х10; $480)

Общая стоимость двери, обшивки и опалубки: $720

Введите 1-4 или ' q' для выхода

Дверь 1 (12х8; $380) Дверь 2 (12х10; $420)

Дверь 3 (16x8; $450) Дверь 4 (16x10; $480)

q

*/