Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Возвращение ссылки из функции

19.06.2016, 01:02. Показов 6266. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, я немного не понимаю, почему в следующем коде в строках 16-17 надо возвращать именно ссылку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <conio.h>
 
class Test {
private:
    int data;
 
public:
    Test() { std::cout << "\nDEFAULT CTOR\n"; }
    Test(int data) : data(data) { std::cout << "\nINT CTOR\n"; }
    Test(const Test & test_ref) : data(test_ref.getData()) { std::cout << "\nCOPY CTOR\n"; }
 
    const int & getData() const { return data; }
    int & getData() { return data; }
};
 
int main() {
 
    std::vector<Test> vec(5, Test{5});
 
    std::cout << "\n";
 
    for (auto & t : vec)
    {
        std::cout << t.getData() << std::endl;
        t.getData() = rand() % 30;
    }
 
    std::cout << "\n";
 
    for (auto it = vec.begin(); it != vec.end(); ++it)
        std::cout << it->getData() << std::endl;
 
    _getch();
}
Почему, если мы возвращаем не int&, а просто int, присваивание в строке 29 не работает? Ведь мы возвращаем член класса.

PS если возвращать не по ссылке - будет возвращаться rvalue? Почему? Это же член класса.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2016, 01:02
Ответы с готовыми решениями:

Возвращение значения в функции, ссылки, вычислить корни квадратного уравнения
Определить функцию вычисления корней квадратного уравнения. Функция должна возвращать значение 1, если корни найдены, значение 0, если...

Возвращение ссылки на локальный объект
В каком-то коде мельком видел что-то вроде: char&amp; char_stub() { char c; return c; }; int main() {

Возвращение ссылки на локальную переменную
Заметил недавно одну интересную вещь. Как вообще работает такой код? Причем коректно. int&amp; func(); int main() { cout &lt;&lt;...

53
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.06.2016, 14:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Как будет реализовано - без разницы.
Какие могут быть способы их реализации в языке, кроме как через указатели?
Каким образом их можно реализовать без использования указателей?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 14:31
Ferrari F1, через сам объект .......................................

C++
1
2
3
4
5
6
int main()
{
Foo obj;
Foo& ref = obj;
ref->fn();
}
тут ref вполне будет тем самым объектом, а не указателем )
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 14:32
Ferrari F1, причем здесь как она будет реализована?
Ссылка != разыменнованный указатель.
Реализация может делать что угодно, на язык это не влияет.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.06.2016, 14:45
Croessmah, т.е. стандартом не определено, как ссылка реализована в языке? А то, что она с точки зрения ассемблерного кода выглядит как указатель, то это заслуга разработчика конкретного компилятора? И на другом компиляторе ссылка может не представлять из себя указатель, если смотреть на низком уровне?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 14:55
Цитата Сообщение от Croessmah Посмотреть сообщение
Реализация может делать что угодно, на язык это не влияет.
Что угодно она может делать только на бумаге. На практике указатель под капотом - единственный разумный способ реализовать ссылку.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
тут ref вполне будет тем самым объектом, а не указателем )
Если написать Foo* ref = &obj , оптимизатор точно также может выкинуть ref и обращаться напрямую к obj. Будем теперь говорить что реализация указателя тоже не определена?

Добавлено через 2 минуты
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
И на другом компиляторе ссылка может не представлять из себя указатель, если смотреть на низком уровне?
Да, на другом компиляторе ссылка может представлять собой символьное имя объекта, для поиска в таблице объектов. Только компилятором этим никто не будет пользоваться, потому что тормозит, зараза.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 15:03
Ferrari F1, Renji, причем здесь низкий код и ассемблер?
Мы говорим о C++, а не о асме.
В C++ указатель и ссылка понятия разные.
Вы же, почему-то не говорите, что указатель реализован как число и бла-бла-бла,
а еще там электроника, электроны, дырки, насмешили, честно

Добавлено через 1 минуту
Renji, только тут уже появилось слово оптимизатор. Не заметили?

Добавлено через 3 минуты
Итого: ссылка и указатель понятия разные, как оно будет реализовано в конечном итоге - плевать. В люблм случае это некая абстракная система, придуманрая людьми для укращения электроники. Если хотите, можете еще ниже копать. Смысл?
Есть язык, есть его правила. Всё остальное - реализация, которая лишь реализует эти правила, а не задает их.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 15:05
Цитата Сообщение от Croessmah Посмотреть сообщение
Renji, только тут уже появилось слово оптимизатор. Не заметили?
Так и выкидывание объекта типа "ссылка" это точно такая же оптимизация.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 15:09
Цитата Сообщение от Renji Посмотреть сообщение
На практике указатель под капотом - единственный разумный способ реализовать ссылку.
Ну это попытка забежать с канистрой бензина в тему священных битв "Ссылка - саморазыменованый указатель, или результат разыменования указателя - ссылка на объект"
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.06.2016, 15:13
Цитата Сообщение от Croessmah Посмотреть сообщение
Мы говорим о C++, а не о асме.
В C++ указатель и ссылка понятия разные.
Я хочу щас забыть понятиях, принятых в стандарте, потому что это все абстракции.
Я знаю, что согласно стандарту ссылка - это не хитрожопый указатель.
Хотел лишь для себя узнать, специфицируется ли в стандарте способ реализации ссылок, т.е. я надеялся примерно на ответ, какой его дал Renji.

Цитата Сообщение от Croessmah Посмотреть сообщение
ссылка и указатель понятия разные
Как понятия-то они разные, хотел лишь узнать, есть ли отличия между ними на низком уровне.
Просто я раньше считал, что если функция имеет формальные параметры-ссылки, то копирования не происходит вообще. Но недавно увидел, что это не так.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 15:20
Renji, не совсем. Ссылка - псевдоним, семантически ссылка не создает объект.
В стандарте даже сказано
it is unspecified whether or not a reference required storage
Ну и
A reference can be thought of as a name of a object
То есть выпиливание ссылки разрешено без всяких оптимизаций,
т.к. она может совсем не занимать место (просто псевдоним), если это возможно.
Также, например, ссылка может продлить время жизни временного объекта,
не припомню такое о указателях.
Так что ссылки - отдельный механизм языка.

P.S. и это мы еще не затронули разницу l/rvalue

Добавлено через 2 минуты
Ferrari F1, нет, стандарт не говорит как должна быть реализована ссылка. Вот и весь ответ.
Что касается низкого уровня и реализации (в т.ч. оптимизаций), то код с ссылками, скорее всего, будет идентичен коду с указателями.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.06.2016, 15:26
Цитата Сообщение от Croessmah Посмотреть сообщение
Итого: ссылка и указатель понятия разные, как оно будет реализовано в конечном итоге - плевать. В люблм случае это некая абстракная система, придуманрая людьми для укращения электроники. Если хотите, можете еще ниже копать. Смысл?
То есть можно ограничиться лишь абстракцией? А ты мелкие объекты передаешь в функции по константной ссылке или по значению? И почему?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 15:37
ct0r, я всегда заварачиваю мелкие объекты в вектор, который потом пихаю в список, и всё обязательно еще обкладываю shared_ptr'ом, так надежнее
Это я к тому, что ситуации разные, объекты разные.
Объект в 1Кб считается мелким, если все остальные в тысячу раз больше?
Что касается int'ово подобных, то, конечно же копию.
Кстати, тут сразу всплывает вопрос о шаблонах.
А как там передаете?
Отдельные версии для фундаментальных типов пишите?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 15:40
Цитата Сообщение от Croessmah Посмотреть сообщение
Это всё неоднократно обсуждалось на форуме.
Каждый раз, когда возникает эта тема (а возникает она регулярно ), кто-нибудь обязательно пишет в ней подобную фразу. Однако, понятнее от нее не становится. И например я до сих пор не понимаю этих вещей. А выяснить их на форуме тяжело - потому что в темы приходят гуру и закатывая глаза восклицают - сколько можно, уже 200 раз разжевано! (Хорошо еще один из таких гур сейчас временно в бане ) А вопросы действительно простые:

1) семантика ссылок (при передаче в функцию, возврате, присваивании и т.п.)

2) реализация ссылок (кому интересно)

Мне непонятно даже первое.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 15:42
Цитата Сообщение от Croessmah Посмотреть сообщение
Ссылка - псевдоним, семантически ссылка не создает объект.
Чтобы избежать создание объекта, надо на стадии компиляции вычислить куда эта ссылка ведет. А это как раз и есть работа оптимизатора. В общем ведь случае такое вычисление невозможно, а для частных случаев нужны хитрые оптимизирующие алгоритмы. Те же самые что указатели выкидывают.
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть выпиливание ссылки разрешено без всяких оптимизаций,
т.к. она может совсем не занимать место (просто псевдоним), если это возможно.
Это разрешение имеет практический смысл лишь в том случае, если ссылка находится внутри структуры. Вы же не можете средствами языка узнать выпилена ли стековая переменная или нет. Но я слабо представляю кто и зачем будет ставить внутрь структуры ссылку вычисляемую на стадии компиляции.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 15:45
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если сказать адрес таксисту, он довезёт вас к дому, но это не значит, что адрес == дом. То бумажка на 4 байта, а то гора кирпичей.
О, как прозрачны и понятны указатели в Си! Говоришь таксисту адрес (или хоть координаты для GPS), он тебя привозит, а там уже не дом, а чистое (условно) поле. И ты такой - ну что же, у меня только этот адрес, придется жить здесь
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 15:47
_Ivana, так думаю это связано с тем, что язык/Страуструп/учебники не могу и сами разъяснить эти нюансы. Подпись Croessmah полностью раскрывает большинство тем С++
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 15:48
Цитата Сообщение от _Ivana Посмотреть сообщение
О, как прозрачны и понятны указатели в Си! Говоришь таксисту адрес (или хоть координаты для GPS), он тебя привозит, а там уже не дом, а чистое (условно) поле.
А с ссылками не так что ли?
C++
1
2
3
int&x=object->x;
delete x;
x=1234;//опс...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 15:48
Цитата Сообщение от _Ivana Посмотреть сообщение
О, как прозрачны и понятны указатели в Си! Говоришь таксисту адрес (или хоть координаты для GPS), он тебя привозит, а там уже не дом, а чистое (условно) поле. И ты такой - ну что же, у меня только этот адрес, придется жить здесь
Или еще круче: применяешь действие "открыть дверь" к полю, а оно тебя критует (бьет молнией сверху)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 15:49
Цитата Сообщение от Renji Посмотреть сообщение
delete x;
Упс, delete object.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 15:50
rikimaru2013, нет, я верю что есть люди (и их немало), которые до конца разбираются в этом всем хотя бы на уровне семантики. Причем, я полагаю, что таких немало даже на этом форуме. Но им скучно в 100-й раз объяснять ламерам все, и поэтому они акцентируют внимание на внутренних тонкостях. Так вот я тоже хочу примкнуть к их числу, и также с ощущением знания смотреть на барахтающихся и непонимающих
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2016, 15:50

Возвращение const ссылки на временный объект
Добрый вечер, #include &lt;iostream&gt; using namespace std; struct Point { int _x; int _y; };

Возвращение ссылки на локальный объект
int&amp; foo() { int a; //: warning C4172: возвращение адреса локальной или временной переменной return a; } ...

Возвращение ссылки на указатель использование её как левостороннего значения
Есть шаблон: //------------------------------------------------------- template&lt;class T&gt; struct ts { private: void* data; ...

Возвращение ссылки или указателя на закрытый элемент класса.
Всех уважаемых форуман. поздравляю с наступившим новым годом и прошу ответить на такой вопрос. Почему до сих пор современный C++ не...

Возвращение результата функции bool и использование его в функции main()
У меня есть функция bool, которая имеет вид: bool Pisos(int row, int place) { if (...) return true; else return false;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru