
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Преобразования объектов в основные типы и наоборот
Если необходимо осуществить преобразование определённых программистом типов в основные типы, то нельзя положиться на встроенные функции преобразования. В этом случае программисту необходимо самому написать функции для преобразования типов.
Рассмотрим пример перевода английской меры длины в метры и обратно, в котором показано, как происходит преобразование основного типа в тип, определённый программистом, и наоборот.
…
const float Kmf = 3.280833; // коэффициент
class Dist {
private:
int feet;
float inch;
public:
Dist() { feet = 0; inch = 0.0; }
Dist(int f, float i) { feet = f; inch = i; }
Dist(float m) { //конструктор перевода из метров в футы
float ff = Kmf*m;
feet = int(ff);
inch = 12*(ff-feet);
}
void show() {
cout << feet << "'-" << inch;
}
operator float() { //метод для перевода АТД к стандартному float
float fut = inch/12;
fut = fut + float(feet);
return fut/Kmf;
}
};
//---------------------------------------------------------------------------
int main() {
Dist d1;
float metr = 2.35, metr2=0.0;
d1 = Dist(metr); //переводим float в Dist
cout << "\nd1 = "; d1.show(); //увидим d1=7'-8.51949
metr2 = float(d1); //переводим Dist во float (можно написать просто metr2 = d1; )
cout << "\nmetr2 = " << metr2; //увидим metr2=2.35
getch(); return 0;
}
Для перехода от основного типа float к определённому программистом типу Dist мы используем конструктор с одним аргументом Dist(float m)…. Такого рода конструкторы иногда называют конструкторами преобразования. Этот конструктор вызывается, когда создаётся объект класса Dist с одним аргументом. Для перехода от определённого программистом типа Dist к основному типу float (в данной программе) используется метод преобразования. Этот метод принимает значение объекта класса Dist, преобразовывает его в значение типа float, представляющее собой метры, и возвращает это значение.
Преобразование объектов классов в объекты других классов
При преобразовании объектов одного класса в объекты другого класса применяются те же два способа преобразования, что и для преобразований между основными типами и объектами определённых пользователем классов, т.е. используется конструктор с одним аргументом или операция преобразования. Выбор зависит от того, хотите ли вы записать функцию преобразования в классе для исходного объекта или для объекта назначения. Если процедура преобразования записана в классе назначения, то используется конструктор, если процедура в исходном классе, то применяется операция преобразования. Класс назначения - это класс, объект которого получает значение. Например, записано object_a=object_b; , где object_a – объект класса А (это класс назначения), а object_b – объект класса В.
Рассмотрим программу, в которой производятся преобразования между двумя способами исчисления времени: 12-часовым и 24-часовым. На этом примере рассмотрим случай, когда функция преобразования расположена в исходном классе, следовательно исходя из упомянутого выше правила реализуем преобразование объекта одного класса в объект другого класса в виде операции (метода) преобразования.
class Time12 {
private:
bool pm; int hrs; int mins;
public:
Time12( ) : pm(true), hrs(0), mins(0)
{ }
Time12(bool ap, int h, int m) : pm(ap), hrs(h), mins(m)
{ }
void display( ) const {
cout << hrs << ':';
if (mins < 10) cout << '0';
cout << mins << ' ';
string am_pm = pm ? "p.m." : "a.m.";
cout << am_pm;
}
};
//---------------------------------------------------------------------------
class Time24 {
private:
int hours; int minutes; int seconds;
public:
Time24( ) : hours(0), minutes(0), seconds(0)
{ }
Time24(int h, int m, int s) : hours(h), minutes(m), seconds(s)
{ }
void display( ) const {
if (hours < 10) cout << '0';
cout << hours << ':';
if ( minutes < 10 ) cout << '0';
cout << minutes << ':';
if ( seconds < 10 ) cout << '0';
cout << seconds;
}
operator Time12( ) const;
};
//---------------------------------------------------------------------------
Time24::operator Time12( ) const {
int hrs24 = hours;
bool pm = hours < 12 ? false : true;
int roundMins = seconds < 30 ? minutes : minutes + 1;
if (roundMins == 60) {
roundMins = 0;
++hrs24;
if (hrs24 == 12 || hrs24 == 24) pm = (pm == true) ? false : true;
}
int hrs12 = (hrs24 < 13) ? hrs24 : (hrs24 - 12);
if (hrs12 == 0) {
hrs12 = 12;
pm = false;
}
return Time12(pm, hrs12, roundMins);
}
//---------------------------------------------------------------------------
int main( ) {
int h, m, s;
while (true) {
cout << "Vvedite vremja v 24 formate: \n";
cout << " Chasy (от 0 до 23): "; cin >> h;
if (h > 23) return (1);
cout << " Min: "; cin >> m;
cout << " Sek: "; cin >> s;
Time24 t24(h, m, s); // присвоили объекту значения, введенные с клав.
cout << "Ishodnoe vremja: "; t24.display( );
Time12 t12 = t24; // преобразование
cout << "\nV 12-chas formate: "; t12.display( );
cout << "\n\n";
}
return 0;
}
//----------------------------------------------------
Функция Time24::operator Time12( ) const преобразует вызывающий её объект t24 в объект класса Time12 и возвращает его в главную функцию.
Если функция преобразования находится в классе назначения, то необходимо использовать конструктор с одним аргументом. В этом случае мы должны были в классе Time12 написать конструктор с 1 аргументом Time12(Time24) и метод Time12::Time12(Time24 t24).
Лекция 7 (15 стр.)