2010-05-28 3 views
3

Давайте обсудим эти две функции:Функция должна возвращать ссылку или объект?

  1. комплекс & оператор + = (Const T & VAL);
  2. комплекс оператор + (const T & val);

Где «complex» - это имя класса, реализующего, например, сложную переменную.

Итак, первый оператор возвращает ссылку, чтобы можно было написать + = b + = c (что эквивалентно b = b + c; a = a + b;).

Второй оператор возвращается и объект (NOT A REFERENCE), мы все еще можем написать a = b + c + d.

Кто мог бы объяснить мне этот нюанс? В чем разница между возвращаемой ссылкой или объектом?

ответ

1

В 1, a + = b, оператор + = модифицирует a. Поэтому он может вернуть ссылку на себя, потому что сам по себе является правильным результатом операции.

Однако, в 2. требуется новый объект, потому что a + b возвращает то, что не является, поэтому возвращение ссылки на a будет неправильным.

4

Операторы присваивания поддерживают многократное применение на тот же объект:

(a += b) += c; 

который добавит как b и c к a. Чтобы это сработало, a += b должен вернуть ссылку на a. Однако оператор сложения не требует этого, поскольку выражение b + c + d не имеет побочного эффекта. Только окончательное назначение a имеет побочный эффект.

1

Нюанс в примерах, которые вы даете, в некотором роде.

От оператора + вы ожидаете вернуть другое значение из двух, с которых вы начали: b + c не является ни b, ни c, это что-то еще. Таким образом, мы не можем возвращать ссылки на b или c ... и не выделять новый объект в стеке, это будут только два, с которыми мы должны работать. Таким образом, мы должны вернуть значение.

И вы уже объяснили себе, почему оператор + = возвращает то, что он делает.

0

В первом случае вы добавляете что-то к объекту слева, но значение выражения - это объект слева. Поэтому вы возвращаете что-то (обычно левое) по ссылке. Например:

cout << (a+=b) 

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

if(...) 
{ 
    T a = b + c; 
    cout << a; 
} 
1

complex& operator+=(const T& val); Поскольку работает на this и потому complex operator+(const T& val); необходимо создать новый временный объект на сумму.

Если вы хотите вернуть объект с +=, то возможно делать то, что вы ожидаете, но там могут быть дополнительные экземпляры. Как вы уже упоминали, вы бы хотите это поведение, если вы хотите звонить в сети.Если вы вернули временное письмо и написали (a += b) += c, ваше добавление c будет потеряно, когда оно будет уничтожено во временное.

Если вы хотите вернуть ссылку от +, у вас будет ссылка на временное, и ваша программа будет иметь неопределенное поведение. Вы можете написать a=b+c+d, так как b+c создает временные b1 и b1 + d создает временный b2, который затем присваивается a.

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