Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Компилятор.


Автор: KAMLS 23.5.2017, 07:21
Здравствуйте!
Помогите пожалуйста понять что делает компилятор в подобной ситуации.
Конструктор класса при создании объекта должен переводить формат времени 24 часа в формат времени 12 часов.
Но конструктор должен работать только в момент создания объекта.
time12 t12;
Почему же работа функции конструктора осуществляется в следующей строке?
t12=t24;
Строка 91-92
Код рабочий, выглядит вот так:
Код

#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
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:
    bool pm;
    int hrs;
    int mins;
public:
    time12(): pm(true), hrs(0), mins(0)
    {}
    time12(time24);
    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;
}
};
time12::time12(time24 t24)
{
    int hrs24=t24.getHrs();
    pm=t24.getHrs()<12 ? false : true;
    mins=t24.getSecs()<30 ? t24.getMins() : t24.getMins()+1;
    if(mins==60)
    {
        mins=0;
        ++hrs24;
        if(hrs24==12 || hrs24==24)
            pm=(pm==true) ? false : true;
    }
    hrs=(hrs24<13) ? hrs24 : hrs24-12;
    if(hrs==0)
    {
        hrs=12;
        pm=false;
    }
}
int main()
{
    setlocale(LC_ALL,"rus");
    int h,m,s;
    while(true)
    {
        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<<"\nИсходное время: ";
        t24.display();
        time12 t12;
        t12=t24;
        cout<<"\nВ 12-часовом формате: ";
        t12.display();
        cout<<"\n\n";
    }
        getch();
        return 0;
    }

Автор: volatile 23.5.2017, 11:10
Цитата(KAMLS @  23.5.2017,  07:21 Найти цитируемый пост)
Почему же работа функции конструктора осуществляется в следующей строке?
t12=t24;

Так как в классе time12 нет "operator= (const time24 &);" происходит неявная конвертация:
1. создается временный объект time12 
2. вызывается присваивание его значения t12
3. удаление временного объекта.
Это все происходит в одной этой строке:
Цитата(KAMLS @  23.5.2017,  07:21 Найти цитируемый пост)
t12=t24;

чтобы избежать неявной конвертации можно объявить конструктор так:
Цитата(KAMLS @  23.5.2017,  07:21 Найти цитируемый пост)
  explicit time12(time24);


Автор: KAMLS 23.5.2017, 13:56
Ну вообще, именно так конструктор и реализован в классе time12. Строка 44.
В оригинале строка конвертации временного формата с использованием конструктора выглядит так:
time12 t12=t24;
но я в процессе познания работы конструкторов разбил строку на 2 строки чтобы посмотреть что получится.
Оказалось компилятор справляется. Захотелось узнать как.
Я еще многого не знаю про возможности компилятора по неявным действиям.
p.s. Ах да, explicit то там нету, я его только сейчас изучать начал))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)