- •1. Абстрактные типы данных
- •Пример 1
- •1.4. Разработка объектов
- •1.4.1. Объекты и композиция
- •Пример 3
- •1.4.3. Объекты и наследование
- •1.4.4. Наследование в программировании
- •1.4.5. Упорядоченные списки и наследование
- •1.4.6. Повторное использование кода
- •1.4.7. Спецификации класса SeqList и OrderedList
- •1.5. Приложения с наследованием классов
- •1.6. Разработка объектно-ориентированных программ
- •1.6.1. Анализ задачи/определение программы
- •1.6.2. Разработка
- •1.6.3. Кодирование
- •1.6.4. Тестирование
- •1.6.5. Иллюстрация программной разработки: Dice график
- •Замечание
- •Программа 2. Диаграмма бросания костей
- •1.7. Тестирование и сопровождение программы
- •1.7.1. Объектное тестирование
- •1.7.2. Тестирование управляющего модуля
- •1.7.3. Программное сопровождение и документирование
- •1.9. Абстрактные базовые классы и полиморфизм
- •1.9.1. Полиморфизм и динамическое связывание
- •2.1. Пользовательский тип — класс
- •2.1.1. Объявление класса
- •Пример 1.
- •2.1.2. Конструктор
- •2.1.3. Объявление объекта
- •2.1.4. Реализация класса
- •2.1.5. Реализация конструктора
- •2.1.6. Создание объектов
- •Пример 2.
- •2.2. Примеры классов
- •2.2.1. Класс Temperature
- •2.2.2. Реализация класса Temperature
- •2.2.3. Класс случайных чисел
- •Пример 3.
- •2.2.4. Реализация класса RandomNumber
- •2.3. Объекты и передача информации
- •2.3.1. Объект как возвращаемое значение
- •2.3.2. Объект как параметр функции
- •2.4. Массивы объектов
- •2.4.1. Конструктор умолчания
- •2.5. Множественные конструкторы
- •2.5.1. Реализация класса Date
- •2.6. Практическое применение: Треугольные матрицы
- •2.6.1. Свойства верхней треугольной матрицы
- •2.6.2. Хранение треугольной матрицы
- •Пример 4.
- •Пример 5.
- •2.6.3. Класс TriMat
- •2.6.5. Реализация класса TriMat
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
*/