Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компилятор. 
:(
    Опции темы
KAMLS
Дата 23.5.2017, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.5.2017

Репутация: нет
Всего: нет



Здравствуйте!
Помогите пожалуйста понять что делает компилятор в подобной ситуации.
Конструктор класса при создании объекта должен переводить формат времени 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;
    }


Это сообщение отредактировал(а) KAMLS - 23.5.2017, 07:23
PM MAIL   Вверх
volatile
Дата 23.5.2017, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(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);


PM MAIL   Вверх
KAMLS
Дата 23.5.2017, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.5.2017

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) KAMLS - 23.5.2017, 13:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.