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

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

19.06.2016, 01:02. Показов 5876. Ответов 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru