Перегрузка операторов в C ++

#define TAMSEC 59
#define TAMMIN 59
#define TAMHOURS 23

using namespace std;

class Time{
private:
int hours,
    minutes,
    seconds;
public:
Time(int hours = 0, int minutes = 0, int seconds = 0);
/**Sobre carga operador <<**/
friend ostream& operator << (ostream& out, const Time &obj);
/**Sobrecarga operador (Pre incremento ++)**/
Time& operator ++();
/**Sobrecarga operador (Pos incremento ++)**/
Time operator ++(int);
 };

 /**Sobrecarga operador (Pre incremento ++)**/
Time& Time::operator ++(){
seconds ++;
if(seconds > TAMSEC){
    minutes ++;
    seconds = 0;
    if(minutes > TAMMIN){
        minutes = 0;
        hours ++;
        if(hours > TAMHOURS)
            hours = 0;
    }
}
return *this;
}
/**Sobrecarga operador (Pos incremento ++)**/
Time Time::operator++(int){
Time aux = Time(*this);
seconds ++;
if(seconds > TAMSEC){
    minutes ++;
    seconds = 0;
    if(minutes > TAMMIN){
        minutes = 0;
        hours ++;
        if(hours > TAMHOURS)
            hours = 0;
    }
  }
  return aux;
  }

Он разрабатывал перегрузку операторов pos и pre увеличение моего класса Тайм, мое сомнение коренится, когда я делаю pos, я увеличиваю, сначала хотел возвратить ссылку моего объекта (*aux), который я создал внутри функции член перед тем, как увеличивать Ваши признаки, но эта не оставляет меня, если, что я был должен возвращать объект в если. Почему я не могу возвращать ссылку моего объекта aux?

   Time& Time::operator++(int){
   Time aux = Time(*this);
   seconds ++;
   if(seconds > TAMSEC){
      minutes ++;
      seconds = 0;
      if(minutes > TAMMIN){
        minutes = 0;
        hours ++;
        if(hours > TAMHOURS)
          hours = 0;
      }
   }
   return *aux;
   }
1
задан 25.01.2017, 12:54
2 ответа
int& func()
{
  int variable=5;
  return variable;
}

Давайте анализировать предыдущую функцию:

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

Эта же самая концепция применимая к твоему коду. Никогда ты не должен возвращать ссылку на локальную переменную, потому что жизнь ссылки будет больше, чем жизнь переменной.

В твоем примере, однако, если он стоит делать return *this; потому что, поскольку ты знаешь, *this укажи на настоящий объект, который продолжит быть живым, выйдя из функции пост-увеличения.

Приветствие

3
ответ дан 24.11.2019, 12:50

SerГ - в казавшийся в:

T *p = new T;
T &r = *p;
delete p;
// Hacer uso de r.

Изменчивое помещение одной funcciГіn удалено автоматически, когда заканчивают ее funcciГіn.

Я Предлагаю:

Time operator ++(int) { Time aux = *this; ++*this; return(aux); }

(интерактивно). Предотврати repeticiГіn в cГіdigo шрифт. Из-за того, что он был онлайновым, позвольте, что составитель elimie aux , когда возвращенная стоимость не используется, и applicar лучше copy epsilon, когда возвращенная стоимость sГ - используется.

1
ответ дан 24.11.2019, 12:50