Я знаю, что название звучит знакомо, так как есть много похожих вопросов, но я прошу о другом аспекте проблемы (я знаю разницу между тем, что есть в стеке и помещением их в кучу).Как «вернуть объект» на C++?
В Java я всегда могу вернуться ссылки на «локальный» объекты
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
В C++, чтобы сделать что-то подобное у меня есть 2 варианта
(1) Я могу использовать ссылки, когда мне нужно " возвращение»объект
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Затем использовать его как это
Thing thing;
calculateThing(thing);
(2) Или я могу вернуть указатель на динамически выделенный объект
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Затем используйте его как этот
Thing* thing = calculateThing();
delete thing;
Используя первый подход не будет иметь, чтобы освободить память вручную, но для меня это затрудняет чтение кода. Проблема со вторым подходом заключается в том, что я должен помнить delete thing;
, что выглядит не совсем красиво. Я не хочу возвращать скопированное значение, потому что он неэффективен (я думаю), поэтому здесь возникают вопросы
- Есть ли третье решение (которое не требует копирования значения)?
- Есть ли проблемы, если я придерживаюсь первого решения?
- Когда и почему следует использовать второе решение?
+1 для красиво поставив вопрос. – Kangkan
Чтобы быть очень педантичным, немного неточно сказать, что «функции возвращают что-то». Вернее, * вычисление вызова функции вызывает значение *. Значение всегда является объектом (если оно не является функцией void).Различие заключается в том, является ли значение значением glvalue или значением prvalue, которое определяется, является ли объявленный * возвращаемый тип * ссылкой или нет. –