Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

01.03.2014, 16:41. Просмотров 390. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ссылка на объект, возвращаемый функцией (C++):

Возвращаемый объект разрушается - C++
Написал класс &quot;безопасный массив&quot; и написал метод: const classname&amp; add(int, double) const {classname tmp(*this) *Пропустим return tmp;}...

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

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

Ссылка на объект класса - C++
class Aclass{ public: int i=0; void j(){i=2;} }; Aclass f(){ Aclass w; sA&amp;w; //Как правильно сделать...

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

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

6
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,070
01.03.2014, 17:06 #2
Чтобы не париться по таким вопросам, используйте С++11, где есть move-семантика.
1
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
01.03.2014, 17:22 #3
Цитата Сообщение от nexen Посмотреть сообщение
однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
По константной можно. Или используй с++11, с его rvalue-reference.

А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
C++
1
2
3
4
void foo(vec & val)
{
    // здесь заполняем val
}
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.03.2014, 17:27 #4
Цитата Сообщение от DrOffset Посмотреть сообщение
А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
так есть же еще и RVO всякие.
1
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
01.03.2014, 17:35 #5
Цитата Сообщение от Tulosba Посмотреть сообщение
так есть же еще и RVO всякие.
Да, но надо знать когда на них можно рассчитывать, а когда нет. Дам ТСу ссылку
nexen, RVO на wiki.
У Алёны С++.
Развернуто в MSDN.
1
nexen
187 / 180 / 3
Регистрация: 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
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
01.03.2014, 21:25 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
Привет! Вот еще темы с ответами:

Ссылка на объект класса в массиве - C++
Вообщем есть класс THypergraph в котором находятся два массива объектов класса TGraphObject: class TGraphObject { public: ...

Ссылка на объект как свойство класса - C++
Добрый вечер. Есть 2 класса: сотрудники и компании. Если использовать БД то вопрос бы решался очень просто, он почитав не много понял...

Ссылка на объект не указывает на экземпляр объекта - C++
Подскажите, в чем ошибка и как исправить. struct Node{ Node *prev; Point *point; Node() { prev = nullptr; ...

Ссылка на объект не указывает на экземпляр объекта C++ - C++
Создана прога для расчета сопротивления резисторов. В основной функции в некоторых случаях он все считает, а в некоторых - вылетает вот с...


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

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

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