Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Ссылка на объект, возвращаемый функцией

01.03.2014, 16:41. Просмотров 968. Ответов 6
Метки нет (Все метки)

Безопасно ли подобное?
C++
1
2
3
4
5
6
7
8
9
typedef std::vector< string > vec;
vec someFoo();
vec someBoo()
{
// что-то делаем
vec & x = someFoo();
// что-то делаем с вектором 'x', удаляем некоторые элементы
return x;
}
Таким способом я хотел вместо того, чтобы создавать объект трижды, создавать его хотя бы дважды (по возвращении из someFoo и из someBoo), однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 16:41
Ответы с готовыми решениями:

Возвращаемый объект разрушается
Написал класс &quot;безопасный массив&quot; и написал метод: const classname&amp; add(int,...

Старик Хоттабыч, хочу, что бы результат возвращаемый функцией не стакался...
Доброго времени суток, уважаемые форумчане. У меня такая проблемка....

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается...

Ссылка на объект класса
class Aclass{ public: int i=0; void j(){i=2;} }; Aclass f(){ ...

Ссылка на временный объект
Наткнулся тут в гугле на одну интересную тему. Как известно, данный код не...

6
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
01.03.2014, 17:06 #2
Чтобы не париться по таким вопросам, используйте С++11, где есть move-семантика.
1
DrOffset
7597 / 4566 / 1106
Регистрация: 30.01.2014
Сообщений: 7,429
01.03.2014, 17:22 #3
Цитата Сообщение от nexen Посмотреть сообщение
однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
По константной можно. Или используй с++11, с его rvalue-reference.

А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
C++
1
2
3
4
void foo(vec & val)
{
    // здесь заполняем val
}
1
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.03.2014, 17:27 #4
Цитата Сообщение от DrOffset Посмотреть сообщение
А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
так есть же еще и RVO всякие.
1
DrOffset
7597 / 4566 / 1106
Регистрация: 30.01.2014
Сообщений: 7,429
01.03.2014, 17:35 #5
Цитата Сообщение от Tulosba Посмотреть сообщение
так есть же еще и RVO всякие.
Да, но надо знать когда на них можно рассчитывать, а когда нет. Дам ТСу ссылку
nexen, RVO на wiki.
У Алёны С++.
Развернуто в MSDN.
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.03.2014, 21:17  [ТС] #6
DrOffset, насчет RVO я видел, но разве его можно использовать вручную? Разве это не оптимизация компилятора?
0x10, C++11 использовать не могу
DrOffset, а почему можно только по константной? В смысле, какова логика возвращаемого объекта от функции? Насколько мне известно, возвращаемых значений из функции (в виде return) на самом деле нет. Компилятор перегоняет возвращаемый объект в параметр, а дальше.. а дальше не знаю, посему и предположил, что на самом деле функции в примере идентичны для компилятора:
C++
1
2
3
4
5
6
string f1()
{ return "hello";}
void f2(string & result)
{
result = "";
}
А если они и правда идентичны, то значит (предполагал дальше), неявно создается объект локальный в месте вызова функции, в который записывается возвращаемое значение, а уже этот объект присваивается чему-то, т.е.:
C++
1
2
3
4
5
string out_f1 = f1();
// верхнее раскрывается в нижнее
string param;
f2(param);
string out_f2 = param;
И если это так, что почему именно константной должна быть ссылка на возвращаемый объект?
0
DrOffset
7597 / 4566 / 1106
Регистрация: 30.01.2014
Сообщений: 7,429
01.03.2014, 21:25 #7
Лучший ответ Сообщение было отмечено nexen как решение

Решение

Цитата Сообщение от nexen Посмотреть сообщение
Разве это не оптимизация компилятора?
Оптимизация, вручную ее использовать нельзя. На нее просто можно полагаться в опр. случаях.

Цитата Сообщение от nexen Посмотреть сообщение
DrOffset, а почему можно только по константной?
Потому что возвращаемое значение - это rvalue.

Цитата Сообщение от nexen Посмотреть сообщение
В смысле, какова логика возвращаемого объекта от функции?
Логика заключается в том, что в общем случае делается копия.

Цитата Сообщение от nexen Посмотреть сообщение
Насколько мне известно, возвращаемых значений из функции (в виде return) на самом деле нет. Компилятор перегоняет возвращаемый объект в параметр
Если мы будем рассуждать на этом уровне, то выяснится, что и параметров на самом деле нет. Есть стек и регистры. Но для понимания логики языка про это думать не обязательно.

Вам надо почитать про rvalue и lvalue.
1
01.03.2014, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 21:25

Анонимный объект по аналогии с анонимной функцией (lambda)
Приведу вот такой пример: #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Ссылка на объект класса в массиве
Вообщем есть класс THypergraph в котором находятся два массива объектов класса...

Что лучше: ссылка или объект?
привет, задался таким вопросом: как лучше поступать в следующей ситуации? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru