2013-08-05 2 views
5

В C++, в каких сценариях нам нужно вернуть ссылку из функции? Я понимаю, что использование ссылок как функциональных входов, но для выходных функций, почему мы не можем возвращать только значения или указатели?Когда функция должна возвращать ссылку в C++

+0

не является указателем ссылки? –

+0

@SamIam: Если бы они были одинаковыми и имели одинаковый смысл, почему бы вам подумать, что они даже были бы введены на этом языке в первую очередь? – ereOn

+1

Подумайте, как бы вы реализовали оператор нижнего индекса, например, 'vector', не возвращая ссылку. – jrok

ответ

8

Ссылки служат для присвоения возвращаемым значениям функций. Звучит странно, но в качестве примера оператор присваивания массива в C++ является функцией, которая фактически возвращает ссылку на элемент по индексу, чтобы его можно было присвоить, например.

class Array { 
public: 
    int& operator[] (const int& index); 
    ... 
}; 

Учитывая следующий синтаксис:

Array a; 
a[4] = 192; 

Вдохновленный вечно полезные C++ FAQ:

https://isocpp.org/wiki/faq/references#returning-refs

+3

+1 для ссылки на C++ FAQ – SteveLove

+0

Спасибо. Это убедительный пример. – ahala

+0

@ahala вы можете отметить как ответ, если вы чувствуете, что я полностью ответил на ваш вопрос? – jrs

1

Вы можете вернуть ссылку, если объект уже существует до вызова функции. , то это не проблема.

Этот пост придает этому большое значение. Is the practice of returning a C++ reference variable, evil?

+1

Связанное сообщение обсуждает вопрос с другой стороны, а не на том, когда мы должны возвращать ссылки или возвращаем ссылку лучше, чем возвращать указатели. – ahala

0

Возврат ссылки от функции имеет те же преимущества и недостатки, что и возврат указателя.

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

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

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

+2

, за исключением случаев, когда кто-то возвращает nullptr;) –

+3

Я бы не занижал для этого, но это первое утверждение кажется мне совершенно неправильным. Указатели и ссылки действительно близки, но они определенно разные звери и не имеют одинаковых преимуществ/недостатков в контексте возврата функции. – ereOn

4

Я не уверен, что есть места, где вы должен вернуть ссылку.

Перегрузка operator++() пружины на память, но это все еще не обязано возвращать ссылку. Однако применяются обычные правила: если вы можете вернуть указатель на что-то, вы можете безопасно вернуть ссылку в большинстве случаев. Главное - не возвращать ссылку на то, что выходит за пределы области видимости - как переменная, локальная для этой функции. Возвращение ссылки на *this довольно распространено.

Возвращение значения является ценной вещью, которую можно сделать, поскольку она либо (A) делает копию возвращенной вещи, либо (B) максимально использует семантику перемещения (C++ 11) и/или Оптимизация возвращаемого значения (RVO on wikipedia).

Если вам не нужна или требуется копия, то возврат по ссылке для типов значений обычно является тем, что вы хотите, поскольку вы вряд ли захотите использовать указатель, например, нужно разыменовать возвращаемую вещь с помощью * или ->.

0

Просто помните, что вам необходимо вернуть ссылку на объект, который будет существовать после функция прекращается. Например, вы можете сделать что-то вроде этого:

Val(X,10) = 1; 

где Val это функция, которая возвращает (скажем) ссылка на 10-й элемент в списке, таким образом, установив его на 1.

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