В C++, в каких сценариях нам нужно вернуть ссылку из функции? Я понимаю, что использование ссылок как функциональных входов, но для выходных функций, почему мы не можем возвращать только значения или указатели?Когда функция должна возвращать ссылку в C++
ответ
Ссылки служат для присвоения возвращаемым значениям функций. Звучит странно, но в качестве примера оператор присваивания массива в C++ является функцией, которая фактически возвращает ссылку на элемент по индексу, чтобы его можно было присвоить, например.
class Array {
public:
int& operator[] (const int& index);
...
};
Учитывая следующий синтаксис:
Array a;
a[4] = 192;
Вдохновленный вечно полезные C++ FAQ:
Вы можете вернуть ссылку, если объект уже существует до вызова функции. , то это не проблема.
Этот пост придает этому большое значение. Is the practice of returning a C++ reference variable, evil?
Связанное сообщение обсуждает вопрос с другой стороны, а не на том, когда мы должны возвращать ссылки или возвращаем ссылку лучше, чем возвращать указатели. – ahala
Возврат ссылки от функции имеет те же преимущества и недостатки, что и возврат указателя.
Возвращение ссылки или указателя, не являющегося константой, позволяет вызывающему абоненту записывать переменные-члены и вызывать функции неконстантного члена.
Однако объект, о котором идет речь, должен иметь срок службы дольше, чем требуется для вызова, иначе программа переходит в области неопределенного поведения.
По вопросу должен вернуть ссылку, он полезен для синтаксического сахара, как и для операторов, который, если возвращающие указатели потребуют от вызывающего пользователя разыменовать указатель.
, за исключением случаев, когда кто-то возвращает nullptr;) –
Я бы не занижал для этого, но это первое утверждение кажется мне совершенно неправильным. Указатели и ссылки действительно близки, но они определенно разные звери и не имеют одинаковых преимуществ/недостатков в контексте возврата функции. – ereOn
Я не уверен, что есть места, где вы должен вернуть ссылку.
Перегрузка operator++()
пружины на память, но это все еще не обязано возвращать ссылку. Однако применяются обычные правила: если вы можете вернуть указатель на что-то, вы можете безопасно вернуть ссылку в большинстве случаев. Главное - не возвращать ссылку на то, что выходит за пределы области видимости - как переменная, локальная для этой функции. Возвращение ссылки на *this
довольно распространено.
Возвращение значения является ценной вещью, которую можно сделать, поскольку она либо (A) делает копию возвращенной вещи, либо (B) максимально использует семантику перемещения (C++ 11) и/или Оптимизация возвращаемого значения (RVO on wikipedia).
Если вам не нужна или требуется копия, то возврат по ссылке для типов значений обычно является тем, что вы хотите, поскольку вы вряд ли захотите использовать указатель, например, нужно разыменовать возвращаемую вещь с помощью *
или ->
.
Просто помните, что вам необходимо вернуть ссылку на объект, который будет существовать после функция прекращается. Например, вы можете сделать что-то вроде этого:
Val(X,10) = 1;
где Val
это функция, которая возвращает (скажем) ссылка на 10-й элемент в списке, таким образом, установив его на 1
.
- 1. Функция должна возвращать ссылку или объект?
- 2. C++, когда следует возвращать ссылку?
- 3. Функция JavaScript должна возвращать массив
- 4. Функция OOP getter должна возвращать значение или ссылку частного свойства
- 5. Функция должна возвращать Значение Вопрос
- 6. Функция, которая должна возвращать «», когда неподдерживаемые символы найдены
- 7. Функция, возвращающая ничего, когда она должна возвращать char
- 8. Функция возвращает undefined, когда она должна возвращать логический результат
- 9. функция сравнения должна возвращать int, недолго
- 10. Функция Fitness должна возвращать один скаляр
- 11. Виртуальная функция должна возвращать значение в MS C++
- 12. Пользовательская функция jqgrid должна возвращать массив
- 13. Должна ли эта функция JavaScript возвращать обещание?
- 14. Должна ли каждая функция Javascript возвращать значение?
- 15. Функция должна возвращать запись или указатель?
- 16. Ваша функция пригодности должна возвращать скалярное значение
- 17. Функция должна возвращать float, но она перепуталась!
- 18. Python - функция должна возвращать 2D-список
- 19. Функция должна возвращать логические возвращает undefined
- 20. Функция C++ должна возвращать Long, возвращая значение Integer вместо
- 21. Visual C++ говоря недействительным функция должна возвращать значение
- 22. Что должна существовать функция возвращается в c?
- 23. Должна ли моя функция возвращать False, если она должна возвращать логическое значение?
- 24. Что должна возвращать функция при передаче недопустимых аргументов?
- 25. Когда функция должна быть вызвана?
- 26. Когда функция должна быть эффективной?
- 27. Функция внезапно возвращается, когда она не должна
- 28. Функция должна возвращать результаты при выполнении в предложении select
- 29. Почему главная функция всегда должна что-то возвращать?
- 30. Как решить, должна ли функция возвращать ошибку или генерировать исключение?
не является указателем ссылки? –
@SamIam: Если бы они были одинаковыми и имели одинаковый смысл, почему бы вам подумать, что они даже были бы введены на этом языке в первую очередь? – ereOn
Подумайте, как бы вы реализовали оператор нижнего индекса, например, 'vector', не возвращая ссылку. – jrok