Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

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

19.06.2016, 01:02. Показов 6037. Ответов 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
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 01:09
Вообще я ни разу не ООП-фан (не, идеи Аллена Кея мне нравятся), я имею в виду эту паранойю с инкапсуляцией, но присваивание по геттеру - это имхо сильно Сделать приватный член, не задать его сеттер, возвращать по геттеру ссылку на него и изменять его значение через геттер - это впечатляет!
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 01:13  [ТС]
_Ivana, это просто демонстрация того, что мне не понятно. Я понимаю, что есть сетеры для подобных вещей.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 01:23
С позиций дилетанта могу сказать, что просто инт без ссылки ты возвращаешь не член класса, а его значение, как значение примитивного типа.

И если ты напишешь
C++
1
int getData() { return data + 0; }
ты тоже ожидаешь возвращения какого-то члена класса?
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 01:27  [ТС]
_Ivana, можно сказать, что возвращая что-либо по ссылке, я возвращаю lvalue? А без - rvalue? Это единственное, что укладывается у меня в голове пока что...

Добавлено через 2 минуты
А в случае 16-й строки у меня вообще временный объект возвращается, верно?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 01:27
Цитата Сообщение от meJevin Посмотреть сообщение
t.getData() = rand() % 30;
*смайлик_рука_лицо*


PS. Почему нету смайлика рука лицо на этом форуме??? Как мне теперь общаться с собакой в шапке???
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 01:33
Не знаю ничего про lvalue и rvalue, но живу в заблуждении, что примитивные типы передаются и возвращаются по значению, и чтобы было по ссылке надо это явно указывать, а объекты - по ссылке, и чтобы было по значению надо копировать. В той же джаве объекты передаются по неглубокой копии, а в шарпе есть ключевые слова для управления как передавать. Но конечно спецы С++ расскажут это точнее. Я до сих пор не понимаю ссылки в плюсах

Добавлено через 2 минуты
rikimaru2013, есть: Просто раньше наверное у тебя не было повода для него
1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 01:35  [ТС]
rikimaru2013, просто хотел по-быстрому как-нибудь изменить данные в векторе

Добавлено через 2 минуты
rikimaru2013, или вы тоже про сетеры сейчас будете говорить?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.06.2016, 01:37
Цитата Сообщение от meJevin Посмотреть сообщение
по-быстрому
- это с доступным всему миру членом, без параноидальной приватности, сеттеров и тем более таких волшебных геттеров.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 01:50
Цитата Сообщение от meJevin Посмотреть сообщение
Ведь мы возвращаем член класса.
Возвращаем копию, которая про члены класса ничего не знает.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 01:51  [ТС]
Можем ли мы отойти от тем инкапсуляции, сетеров, гетеров и т.д. Я просто так функцию назвал, я не хотел чего-либо инкапсулировать хардкорно. Объясните, пожалуйста, как эти ссылки вообще работают при возврате из подобной функции.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.06.2016, 01:53
Лучший ответ Сообщение было отмечено meJevin как решение

Решение

Цитата Сообщение от meJevin Посмотреть сообщение
Объясните, пожалуйста, как эти ссылки вообще работают при возврате из подобной функции.
Как указатель, который подвергается автоматическому разыменованию.
1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 01:55  [ТС]
Renji, аааа, теперь это делает смысл. Спасибо огромное.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.06.2016, 06:01
Цитата Сообщение от meJevin Посмотреть сообщение
Объясните, пожалуйста, как эти ссылки вообще работают при возврате из подобной функции.
Чтобы вернуть из функции сам объект, нужно возвращать ссылку или указатель на него. При возврате значения возвращается копия.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 06:14
Mr.X, тогда получается, что вернуть объект можно только в качестве ссылки(псевдоним имени объекта) - другие вещи не возвращение объекта)))
Указатель? Адрес(переменная) на объект
Копия? Это уже клон, а не сам объект и воздействие на один не другой не влияет )

(с) с ув. придира
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.06.2016, 06:48
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Mr.X, тогда получается, что вернуть объект можно только в качестве ссылки(псевдоним имени объекта) - другие вещи не возвращение объекта)))
Указатель? Адрес(переменная) на объект
Копия? Это уже клон, а не сам объект и воздействие на один не другой не влияет )
(с) с ув. придира
Ну, указатель тоже часто называют ссылкой, так как он таки ссылается на объект. В других языках это единственная форма ссылки. Плюсовые ссылки - это синтаксический сахар, придуманный Страуструпом для красивой записи перегрузки операторов.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.06.2016, 07:11
Цитата Сообщение от _Ivana Посмотреть сообщение
С++ расскажут это точнее. Я до сих пор не понимаю ссылки в плюсах
Я тоже до недавнего времени не понимал этих ссылок, думал, что при их использовании вобще не производится копирования(даже указателей), как выяснилось несколько дней назад в одной из тем, ссылки - это просто замаскированные указатели, которые саморазыменовываются, судя по ассемблерным листингам программ.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
19.06.2016, 07:57  [ТС]
Mr.X, понял. Получается, когда я в строке 17 возвращаю просто int, у меня код в что-то подобное превращается?
C++
1
int getData() { return int{data}; }
Добавлено через 7 минут
имплиситли, оф корс

Добавлено через 16 секунд
А потом такие дауничи, как я, путаются в ссылках
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.06.2016, 08:01
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Указатель? Адрес(переменная) на объект
Однако, разыменование дает сам объект
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
ссылки - это просто замаскированные указатели, которые саморазыменовываются, судя по ассемблерным листингам программ.
Смотря в каком контексте.
И с точки зрения языка, ссылки - это псевдонимы.
Как будет реализовано - без разницы.
Это всё неоднократно обсуждалось на форуме.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.06.2016, 13:55
Croessmah, если сказать адрес таксисту, он довезёт вас к дому, но это не значит, что адрес == дом. То бумажка на 4 байта, а то гора кирпичей.

P.S. Если вы решили забрать у меня звание придиры в этой теме - у вас ничего не получится!!!!111111
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2016, 13:55
Помогаю со студенческими работами здесь

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


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

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

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru