- •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 стр.)
