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

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

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

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

01.03.2014, 16:41. Просмотров 365. Ответов 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), однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 16:41     Ссылка на объект, возвращаемый функцией
Посмотрите здесь:

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

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

Ссылка на объект класса - 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: ...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
01.03.2014, 17:06     Ссылка на объект, возвращаемый функцией #2
Чтобы не париться по таким вопросам, используйте С++11, где есть move-семантика.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
01.03.2014, 17:22     Ссылка на объект, возвращаемый функцией #3
Цитата Сообщение от nexen Посмотреть сообщение
однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
По константной можно. Или используй с++11, с его rvalue-reference.

А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
C++
1
2
3
4
void foo(vec & val)
{
    // здесь заполняем val
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.03.2014, 17:27     Ссылка на объект, возвращаемый функцией #4
Цитата Сообщение от DrOffset Посмотреть сообщение
А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
так есть же еще и RVO всякие.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
01.03.2014, 17:35     Ссылка на объект, возвращаемый функцией #5
Цитата Сообщение от Tulosba Посмотреть сообщение
так есть же еще и RVO всякие.
Да, но надо знать когда на них можно рассчитывать, а когда нет. Дам ТСу ссылку
nexen, RVO на wiki.
У Алёны С++.
Развернуто в MSDN.
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;
И если это так, что почему именно константной должна быть ссылка на возвращаемый объект?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией
Еще ссылки по теме:

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

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

Что вернуть по ссылке, если объект функцией поиска не найден? - C++
Здравствуйте всем! Имеется проблема: приведенная ниже функция ищет элемент (объект класса TreeNode) в бинарном дереве (объект класса...

Непонятный возвращаемый тип - C++
Расскажите какой тип должен быть у переменной idRe, чтобы можно было бы присвоить ему значение s.length , если s объект класса string?

Возвращаемый тип по умолчанию - C++
Приветствую всех! В книге Р. Лафоре &quot;Объектно-ориентированное программирование в C++&quot; прочитал следующее: Скажите, с чем связан...


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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nexen Посмотреть сообщение
Разве это не оптимизация компилятора?
Оптимизация, вручную ее использовать нельзя. На нее просто можно полагаться в опр. случаях.

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

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

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

Вам надо почитать про rvalue и lvalue.
Yandex
Объявления
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией
Ответ Создать тему
Опции темы

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