возвращаемое значение для оператора + () перегрузка - PullRequest
2 голосов
/ 01 февраля 2012

Почему компилятор не возвращает ошибку, если operator+() функция-член класса date ничего не возвращает.если я сделаю

date d1,d2;
date any = d1 + d2;

, то d1 + d2 создаст временный файл, с чем инициализируется этот временный файл?

date operator+(date d)  
{  
    day += d.day; 
    month += d.month; 
    year += d.year; 
}

Примечание: это только для целей тестирования.Не для коммерческого использования или чего-либо еще.

Ответы [ 5 ]

4 голосов
/ 01 февраля 2012

Так как это operator +(), а не operator +=(), вы должны создать временное и вернуть то же самое:

date operator + (const date &d) const
{            //  ^^^^ 1         ^^^^^ 2
  date temp = *this;  // copy current object
  ...
  return temp;  // important: -Wall warned you for missing 'return'
}

Есть еще 2 важных изменения, которые вы можете увидеть:

(1) Передача d как const ссылка; потому что вам не нужна другая копия

(2) Исправить operator + как const, добавив const в конце; потому что вы не собираетесь изменять this объект

Обновление : ответ на ваш обновленный вопрос приведен по ссылке.

Почему «не все пути управления возвращают значение» является предупреждением, а не ошибкой?

2 голосов
/ 01 февраля 2012

Что должен вернуть следующий перегруженный оператор класса даты? Я вижу, что он возвращает мусор.

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

Вы должны явно вернуть объект типа Date, используя:

return objName;
1 голос
/ 01 февраля 2012

Вы модифицируете первый операнд +, что неверно. Получить копию и вернуть ее:

date operator+(date d) const { 
    date r = *this;
    r.day += d.day; r.month += d.month; r.year += d.year;
    return r;
}
0 голосов
/ 01 февраля 2012

Нет другого способа, кроме как создать новый объект для возврата. Не беспокойтесь о копировании временного объекта, большинство компиляторов используют здесь NRVO.

0 голосов
/ 01 февраля 2012

Объект типа date.

Вы должны создать новую дату, а не делать += различных компонентов.Это связано с тем, что вы хотите, чтобы оператор + вел себя традиционным образом как оператор + для чисел.

...