Функція в об’єкті призначення 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функція в об’єкті призначення



Розглянемо, як виконується це перетворення, коли функція перетворення знаходиться в класі призначення. В цій ситуації використовується конструктор з одним аргументом. Однак все ускладнюється тим фактом, що конструктор класу призначення повинен мати доступ до даних вихідного класу для виконання перетворення. Поля класу time24 позначені як private, тому ми повинні написати спеціальні методи в класі time24, які дозволять прямий доступ до нього. Це методи getHrs(), getMins() та getSecs().

Лістінг програми 10.16.

#include <iostream.h>

#include <conio.h>

#include <bios.h>

#include <string.h>

 

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;

}

int getHrs() const

{return hours;}

int getMins() const

{return minutes;}

int getSecs() const

{return seconds;}

};

////////////////////////

class time12

{private:

int pm;

int hrs;

int mins;

public:

time12():pm(1),hrs(0),mins(0)

{ }

time12(time24);

 

time12(int ap,int h,int m):pm(ap),hrs(h),mins(m)

{ }

void display() const

{cout<<hrs<<”:”;

if (mins<10)

cout<<"0";

cout<<mins<<"-";

if(pm)

cout<<”p.m”;

else

cout<<»a.m»;

}

};

time12::time12(time24 t24)

{int hrs24=t24.getHrs();

pm=t24.getHrs()<12?0:1;

mins=(t24.getSecs()<30)?t24.getMins():t24.getMins()+1;

if (mins==60)

{mins=0;

++hrs24;

if(hrs24==12||hrs24==24)

pm=(pm==1)?0:1;

}

hrs=(hrs<13)?hrs24:hrs24-12;

if (hrs==0)

{hrs=12;pm=0;}

};

////////

int main()

{clrscr();

int h,m,s;

while(1)

//Введіть 24 для виходу

{cout <<”Введіть час у 24 форматі:\n”;

cout <<”Години (0-23):”;cin>>h;

if (h>23)

return(1);

cout <<”Хвилини:”;cin>>m;

cout<<”Секунди:”;cin>>s;

time24 t24(h,m,s);

cout<<”Вихідний час”;

t24.display();

time12 t12=t24;

cout <<”\nУ 12-год формат: “;

t12.display();

cout<<”\n\n”;

};

return 0;

}

Програма 10.16

 

Тут функцією перетворення є конструктор з одним аргументом з класу time12.

time12(time24);

Вона встановлює для об’єкту, що її викликав, значення, яке відповідає значенню об’єкту класу time24, одержаному в якості аргументу.

Функція main() в цій програмі така ж, як і в попередній. В цьому рядку знову відбувається перетворення типів від time24 до time12, але вже з використанням конструктора з одним аргументом

time12 t12=t24;

 

Деякі рекомендації щодо перезавантаження операцій і перетворення типів

Коли які перетворення використовувати?

Як ми вже встановили, якщо перетворення типів передбачене в класі призначення, то слід використовувати конструктор з одним аргументом, а якщо у вихідному класі – то використовується операція перетворення. Який саме спосіб слід вибирати в конкретних випадках? Якщо обидва класи повністю доступні, то можна вибрати будь-який. Але так буває не завжди. Якщо ми купуємо чужу бібліотеку класів, то можемо не мати доступу до її вихідних файлів. Якщо ми будемо використовувати об’єкт такого класу в якості вихідного у перетворенні, то можемо дістати доступ лише до класу призначення, тому використовуватимемо конструктор з одним аргументом. Якщо ж об’єкт призначення належить бібліотечному класу, то ми повинні виконувати операцію перетворення у вихідному класі.

 

«Підводні камені» перезавантаження операцій і перетворення типів

Перезавантаження операцій і перетворення типів дає нам змогу створити, по суті, нову мову. Нехай a, b, c - об’єкти визначеного користувачем класу, а операція + перезавантажена, при цьому рядок

a=b+c;

може означати що-небудь відмінне від того, що було б, якби a,b, c належали до якогось із основних типів. Можливість перевизначення вбудованих блоків мови добра тим, що ми моджемо зробити лістінг програми більш зрозумілим і читабельним. Але можливий і інший результат, коли наш лістінг стане, навпаки, менш зрозумілим і складнішим. Приведемо кілька рекомендацій з цього приводу.

 

Використання схожих значень

Використовуйте перезавантаження операцій для виконання дій, які можна виконати за допомогою основних типів даних. Наприклад, ми можемо перезавантажити знак + для виконання віднімання (матриць, векторів, многочленів і т.д.), але це не зробить наш лістінг зрозумілішим.

Перезавантаження операції передбачає, що це має сенс для виконання певних дій з об’єктами певного класу. Якщо ми збираємося перезавантажити операцію + класу Х, то результат додавання двох об’єктів цього класу повинен хоча б нагадувати суму.

Вивчаючи цю тему, ми перезавантажили операцію + для об’єктів класу Distance і для рядкового типу String, але навряд чи є сенс додавати об’єкти схожі на раніше використовуваний тип TStudent.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 22; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.2.122 (0.007 с.)