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

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

19.06.2016, 01:02. Показов 6230. Ответов 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 15:51
Студворк — интернет-сервис помощи студентам
_Ivana, эт да но это же форум Кстати, у кого-то тут есть блог, в котором предпринята попытка объяснить. Поищите, может он еще жив и Вам станет понятнее.

Renji, я Вам про сам механизм ссылок, Вы мне опять про его реализацию
Я прекрасно знаю о чем Вы говорите, но я о языке, а не о реализации.
Что и как - implementation defined. Это всё, что я хочу донести.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 15:54
Цитата Сообщение от Renji Посмотреть сообщение
А с ссылками не так что ли?
Хм. Вот вы написали отличную семантическую трактовку ссылок - хитрые объекты, содержащие строковые имена для поиска в таблице связей текущего контекста. Если думать так, то наверное похоже. Но это надо еще обдумать тщательнее.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 15:58
Цитата Сообщение от _Ivana Посмотреть сообщение
Хм. Вот вы написали отличную семантическую трактовку ссылок - хитрые объекты, содержащие строковые имена для поиска в таблице связей текущего контекста.
Так как тут их не трактуй, никто в C++ не запрещает уничтожить объект на который все еще существуют живые ссылки. После чего вы окажетесь в той же самой ситуации "искал дом, а там чисто поле".
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.06.2016, 15:59
Цитата Сообщение от Croessmah Посмотреть сообщение
Что касается int'ово подобных, то, конечно же копию.
Так почему здесь копию-то? А не опять ту же константную ссылку? Как ты понимаешь, когда лучше копию, а когда константную ссылку? Расскажи с точки зрения абстракции

Цитата Сообщение от Croessmah Посмотреть сообщение
Кстати, тут сразу всплывает вопрос о шаблонах.
А как там передаете?
Отдельные версии для фундаментальных типов пишите?
Ну тут все просто. Если в подавляющем числе случаев будет передаваться мелкий объект или мы внутри все равно этот объект копируем - то по значению, иначе - по константной ссылке.
Если у нас чаще всего крупные объекты, но способ передачи мелких тоже критичен, то можно просто сделать sfinae по sizeof. Или например врубить оптимизацию argpromotion. Вот мне интересно, как ты до таких решений дойдешь только на абстракциях?

Как бы закон дырявых абстракций от Джоэла.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 16:00
Renji, это потому, что в плюсах нет GC и приходится самому разрушать дома? Но придумали всякие смарт/юник/прочие загнутые поинтеры, чтобы юзер не смог разрушить дом, на который есть живые ссылки?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.06.2016, 16:01
Цитата Сообщение от Croessmah Посмотреть сообщение
Объект в 1Кб считается мелким, если все остальные в тысячу раз больше?
Какой объект "мелкий" - зависит от архитектуры
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 16:08
Цитата Сообщение от _Ivana Посмотреть сообщение
Renji, это потому, что в плюсах нет GC и приходится самому разрушать дома?
Разрушать дома можно и автоматически, а вот учет живых ссылок на эти дома не ведется. Поэтому, вполне могут и висячие ссылки остаться.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 16:14
Если в подавляющем числе случаев
Так это шаблон, который мы отдадим юзеру на пользование.
Неизвестно что там будет.
А еще там несколько шаблонных параметров,
что делает пятиэтажный sfinae под трехэтажный мат
Так почему здесь копию-то?
Конкретно в данном случае тип даже называется фундаментальным,
тогда как ссылка - составной
закон дырявых абстракций
Вы где-то встречали идеальную абстракцию?
Это не совсем дыра.
Не знание устройства ссылок не повлияет на написание программы,
конечно, если её вылизывать, то, можно,
еще под определенное железо заточить,
но тут как бэ еще дальше в лес
Я знаю, что передав ссылку, я,
фактически, влияю на исходный объект.
Что Вы говорите? Реализовано через указатель?
А что такое указатель? Я еще не дошел до этой темы в книжке

Добавлено через 1 минуту
Какой объект "мелкий" - зависит от архитектуры
Значит необходимо выяснить от чего зависит архитектура
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 16:21
Просто буквально сейчас я костылю одну задачку, для упрощения жизни взял язык с GC (поэтому С/С++ не рассматривал), и с удивлением обнаружил, что по ссылке нельзя изменить объект (возможно я глупость сказал). То есть, я передаю ссылку на объект входящим параметром функции, меняю там значение этого входящего параметра, но у меня переписывается адрес на бумажке, а дом не меняется. Хотя я могу по этой бумажке поменять в доме все составляющие - но не сам дом! После сишных указателей меня это удивило, но аналогия с бумажками помогла хоть немного понять суть этого. Да, это было в Джаве. Я спросил мировой разум, какой мейнстримный язык с GC они бы мне посоветовали, чтобы было можно делать по-нормальному, и добрые люди рекомендовали C#, говоря, что там есть волшебные ref и out, которые меня спасут Да, они спасли, но все равно осталась большая часть непонимания, которая мешает испытать полное удовлетворение

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Я знаю, что передав ссылку, я,
фактически, влияю на исходный объект.
Что Вы говорите? Реализовано через указатель?
А что такое указатель? Я еще не дошел до этой темы в книжке
Это как считать интеграл не зная понятия числа и операции сложения, имхо... Хотя конечно приоритеты изучения могут различаться...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 16:27
то как считать интеграл не зная
Нет, это как использовать готовое решение, не зная потрахов.

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

P.S. ливень начался, а у меня чай в соседнем здании...
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.06.2016, 16:49
Цитата Сообщение от Croessmah Посмотреть сообщение
Конкретно в данном случае тип даже называется фундаментальным,
тогда как ссылка - составной
Не понял. Вот у меня есть класс, внутри которого три чара. Как мне передавать объекты - по константной ссылке или по значению? Каков ход рассуждений? Как ты делаешь в своем коде?

Цитата Сообщение от Croessmah Посмотреть сообщение
Вы где-то встречали идеальную абстракцию?
О том и речь, что большинство абстракций - дырявы. Другое дело, что просвечивает не всегда и не всем.

Цитата Сообщение от Croessmah Посмотреть сообщение
Не знание устройства ссылок не повлияет на написание программы,
конечно, если её вылизывать, то, можно,
еще под определенное железо заточить,
но тут как бэ еще дальше в лес
Ну само собой. Кто-то вообще все по значению передает и не парится, че уж там Кому-то важен даже маленький прирост производительности, кому-то нет. И кому важен - тот должен уметь смотреть внутрь.

Цитата Сообщение от Croessmah Посмотреть сообщение
Что Вы говорите? Реализовано через указатель?
А что такое указатель? Я еще не дошел до этой темы в книжке
Осталось еще раз обсудить: указатель - это адрес?

Цитата Сообщение от Croessmah Посмотреть сообщение
Нет, это как использовать готовое решение, не зная потрахов.
ПотрАхов или потрохОв?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.06.2016, 17:07
указатель - это адрес?
Да вроде как деревянная табличка на палке
ПотрАхов или потрохОв?
Затрудняюсь ответить. Можно подсказку 50/50?
Теоретически, знание одного может помешать знанию другого
1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
20.06.2016, 01:09  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
указатель - это адрес?
Указатель эт кароч переменная типа там в ней кароч есть адрес, воооо, а этот адрес че-то содержит, вооо, а этот указатель можно типа нуууу разыменовывать и получать содержимое по адресу, который содержится в этой переменной, вооо.
Ничего себе, какой я умный. Пойду попровожу лекции в вузах и напишу книгу
0
20.06.2016, 09:33

Не по теме:

meJevin, для начала Вам нужно, чтобы утвердили артикли "Типа" и "Вооо" :D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2016, 09:33

Возвращение 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;...


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru