Перегрузка оператора присваивания: если мы возвращаем (* this), которое является значением по указателю / адресу, какой синтаксис для оператора присваивания правильный?

Используя эти два предыдущих потока в качестве примеров

Первая тема:
Почему перегруженный оператор присваивания возвращает ссылку на класс?

Второй поток:
Почему оператор копирования должен возвращать ссылку / постоянную ссылку?

Является ли тип возвращаемого значения перегруженного оператора присваивания классом или ссылкой на класс? Я видел оба:

Point& Point::operator = (const Point& sourcePoint)
{
// As in the first thread I pasted above
return *this;
}

А также

Point Point::operator = (const Point& sourcePoint)
{
// As in the second thread I pasted above
return *this;
}

Какой правильный?

Точно так же, в чем разница между:

int exFunction()
{
int i = 5;
int* iPtr = &i;
return *iPtr;
}

Против:

int& exFunction2()
{
int j = 5;
int* jPtr = &j;
return *jPtr;
}

Спасибо!

0

Решение

Эти двое не совсем похожи.

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

Foo x, y, z;

x = y = z;   // makes y equal to z and returns a reference to self,
// which is assigned to x

Так всегда

Foo & operator=(Foo const &) { /* ... */  return this; }  // copy-assignment

Foo & operator=(/* any other signature */) { /* ... */   return this; }

Теперь второй вопрос: ваш exFunction2 совершенно неправильно и сломано. Он имеет неопределенное поведение, потому что он возвращает ссылку на локальную переменную, которая выходит из области видимости к моменту возврата функции. (Это говорит по существу return j;; помните, что результатом разыменования является lvalue.) Единственный разумный способ написать эту функцию — это exFunction, который может быть сокращен до int exFunction() { return 5; },

Вот связанный вопрос по теме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]