2014-02-19 3 views
0

Я попытался обновить свои знания на C++ и нашел странное поведение. Когда я объявил класс и перегрузил в нем оператор, я забыл, что оператор имеет возвращаемое значение. Это вызвало некоторое поведение, которое я не могу объяснить. Вот код:определение оператора класса C++ без возвращаемого значения

class myClass{ 
    double i; 
    myClass(double value): i(value){} 
    myClass operator+ (const double &param) 
    { 
     i = i + param; 
    } 
}; 

Таким образом, оператор + должен возвращать значение с типом MyClass, но вместо этого он просто добавляет параметров члену я. Когда я попробовал этот оператор в моей программе по

myClass A(10.5); 
A+10.0; 

результат равен а.и. = 20,5, так как я бы ожидать. Но если я изменю код на

A = A + 10.0; 

В результате получается A.i = nan или какое-то очень небольшое число. Я понял, что оператор + должен возвращать значение по определению, но я не добавил возврата к его определению. Мой вопрос: что возвращается в этом случае? Какой-то случайный размер мусора из памяти? Почему компилятор не применяет, чтобы добавить возврат к определению оператора, если ожидается, что оно вернет значение с типом myClass?

+0

Вкратце: то, что вы написали, имеет неопределенное поведение, компилятор не должен его ловить, и что-то вообще может произойти во время выполнения. – Mat

+0

'A + 10.0;' не должен изменять членов A, это то, что для 'operator + =' для! Это просто супер смущает – stijn

+0

Да, это сбивает с толку. Сначала я попробовал A = A + 10.0, и когда понял, что не работает так, как я ожидал, я попробовал простой A + 10.0. Я бы не использовал этот способ своим оператором, просто попытался, если он сработает. –

ответ

1

Какое-то случайное значение для мусора из памяти?

Скорее всего. Формально, как уже отмечалось, поведение не определено, поэтому разрешено что-либо, но большинство реализаций вернет некоторую ценность для мусора.

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

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

Сортировка примера:

int negate(int i) { 
    if (i >= -INT_MAX) 
    return i; 

    /* i cannot be negated */ 
    abort(); 
} 

Вы можете написать такие функции, как это, чтобы предотвратить беззвучно происходит, когда INT_MIN пройдена, чтобы сделать отладку легче. В этом случае проблема return после abort(); не является проблемой. По общему признанию, эта функция имеет оператор return, но, насколько известно компилятору, эта функция может вернуться, достигнув закрытия }.

Некоторые компиляторы имеют возможность предупреждать о отсутствующем заявлении return, поэтому вы можете попытаться повысить уровень предупреждений.

1

Программа имеет неопределенное поведение. Таким образом, он может возвращать все, что присутствует в стеке.

0

Просто стоимость мусора, вы говорите, что ожидаете вернуть значение, но на самом деле не говорите ему, чтобы оно возвращало что-либо.

Смежные вопросы