Используя эти два предыдущих потока в качестве примеров
Первая тема:
Почему перегруженный оператор присваивания возвращает ссылку на класс?
Второй поток:
Почему оператор копирования должен возвращать ссылку / постоянную ссылку?
Является ли тип возвращаемого значения перегруженного оператора присваивания классом или ссылкой на класс? Я видел оба:
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;
}
Спасибо!
Эти двое не совсем похожи.
Во-первых, операторы присваивания. Они должны возвращать ссылку на сам объект, чтобы вы могли использовать их в цепочке:
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; }
,
Вот связанный вопрос по теме.
Других решений пока нет …