Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.62
AlexP11223
54 / 55 / 19
Регистрация: 20.04.2011
Сообщений: 353
#1

Возврат значения по ссылке - C++

01.06.2011, 21:50. Просмотров 3023. Ответов 18
Метки нет (Все метки)

Долго гуглил, но что-то так и не понял. Почему слева от знака = может использоваться только функция, возвращающая ссылку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 21:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Возврат значения по ссылке (C++):

Как происходит возврат значения по ссылке?
Добрый вечер, распишите пожалуйста детально про то, как происходит возврат...

Возврат по ссылке
Приветствую всех! Есть пример из книги Р. Лафоре "Объекто-ориентированное...

Возврат по ссылке
Вычитал давно еще, что если возвращать статический обьект из метода и присвоить...

Наследование, возврат по ссылке..
Есть такое :wall:Я не могу понять, как реализовать :help: ...

Возврат результата из функции через параметр по ссылке
Здравствуйте уважаемый форумчане! Подскажите, как вернуть результат работы...

Повторный возврат рандомного значения ,без изменения значения
Добрый день. Пишу простую консольную игру Кости. Есть 4-е функции прорисовки...

18
besstiaa
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
01.06.2011, 22:33 #2
Это о чем речь?)) Пример?
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
01.06.2011, 22:35 #3
погугли на темы lvalue rvalue.
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 22:38 #4
f() = 1;
Так что ли? Советую не извращаться таким способом.
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
01.06.2011, 22:47 #5
это не извращения, это стандартный способ для записи выражений типа
C++
1
2
i=j=k=10;
cout << i << k << l << '\n';
без возврата по ссылке эти операции были бы невыполнимы
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 22:51 #6
OstapBender, речь шла о знаке =
0
AlexP11223
54 / 55 / 19
Регистрация: 20.04.2011
Сообщений: 353
01.06.2011, 22:52  [ТС] #7
например, задание из Лафоре
В некоторых компьютерных языках, таких, как Visual Basic, есть опера-
ции, с помощью которых можно выделить часть строки и присвоить ее
другой строке. (В стандартном классе string предложены различные под-
ходы.) Используя наследование, добавьте такую возможность в класс
Pstring из упражнения 2. В новом производном классе Pstring2 разместите
три новых функции: left(), mid() и right().
C++
1
2
3
4
5
6
s2.1eft ( s1, n ) // в строку s2 помещаются n саных левых
// символов строки sl
s2.mid ( s1, s, n ) // в стэоку s2 понещаются n символов из строки
// начиная с сиивола номер s
s2.right ( s1, n ) // в строку s2 помещаются n самых правых
// символов строки s1
Вы можете использовать цикл for для копирования символ за символом
подходящих частей строки sl во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте
в этих функциях возврат по ссылке, чтобы они могли быть использованы
с левой стороны знака «равно» для изменения части существующей строки.

Еще раньше было упоминание этого для функции доступа к массиву (вместо []).
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
01.06.2011, 22:52 #8
Потому что если возвращается значение (а не ссылка на значение) то возвращается только копия объекта, а не сам объект. Когда же ты возвращаешь ссылку то функция вернёт ссылку на твой объект, который ты уже можешь изменять (если ссылка не константная).
1
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
01.06.2011, 22:55 #9
Цитата Сообщение от slice Посмотреть сообщение
OstapBender, речь шла о знаке =
ну, а мой пример c i=j=k=10; не демонстрирует это?
= - это и есть функция class& operator=()
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 23:04 #10
Цитата Сообщение от OstapBender Посмотреть сообщение
а мой пример c i=j=k=10; не демонстрирует это?
Нет, не демонстрирует. Тут приоритет операций следующий: i=(j=(k=10)). И где же здесь присваивание тому, что вернула функция? А вот такое ((i=j)=k)=10 это извращение, и все граммотные програмисты запрещают делать такое присваивание, вовращая не простую а константную ссылку.
Что скажешь, умник?
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
01.06.2011, 23:09 #11
Так у вас же функций нет, автор вероятно имел в виду

int &a()
{}
...
a()=3;
0
gooseim
Эксперт С++
510 / 414 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
01.06.2011, 23:12 #12
slice,
C++
1
2
vector<int> n(1);
n[0] = 0;
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 23:19 #13
gooseim
Я же ясно написал, что запись f()=1 я считаю извращением. С какой целью ты приводишь мне другие примеры (припася, скорее всего, в кармане тезис "Оператор - это тоже функция"), мне не понятно.
0
gooseim
Эксперт С++
510 / 414 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
01.06.2011, 23:24 #14
slice, ок
C++
1
2
vector<int> n(1);
n.at(0) = 1;
В некоторых компиляторах нет operator[] для вектора. Как тогда? Вообще не обращаться по индексу, считая это извращением?
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 23:32 #15
gooseim, да, этот код ужасен, нужно срочно переписывать такие компиляторы.
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
01.06.2011, 23:46 #16
Цитата Сообщение от slice Посмотреть сообщение
Нет, не демонстрирует.
ну ок согласен, ошибся, в случае с = & используется для удобства

Цитата Сообщение от slice Посмотреть сообщение
припася, скорее всего, в кармане тезис "Оператор - это тоже функция"
и что? потому что так и есть
и arr[i]=0; хороший пример.
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 23:52 #17
OstapBender, и чё?
0
gooseim
Эксперт С++
510 / 414 / 92
Регистрация: 23.09.2010
Сообщений: 1,159
01.06.2011, 23:55 #18
OstapBender, имелся ввиду внешний вид, а не содержание.
Тут как говорится на вкус и цвет. По моему мнению функция для матрицы Element& get(X, Y) меньшее извращение, чем две функции Element get(X, Y) и set(X, Y, Element), и уж куда меньшее извращение, чем вспомогательные классы для записи [][].
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
02.06.2011, 10:52 #19
gooseim, А по-моему мнению более удобно перегрузить оператор () (X, Y)... Хотя и get и get/set тоже неплохо. По крайней мере get будет константной возвращающей конст ссылку, а set неконстантной ничего не возвращающей. Что несколько более понятно. Функция должна выполнять только 1 вещь (что не всегда возможно впринципе).
0
02.06.2011, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 10:52
Привет! Вот еще темы с решениями:

Возврат значения С++
Hi people! Вот такое задание: 1) Реализовать заданную динамическую структуру...

Возврат значения из функции
Добрый вечер. Вопрос следующий , как возвратить из функции create последнее...

Возврат значения функции
Что такое возврат значения функции? я уже всю голову изломал, что и куда...

Возврат значения из operator=
Товарищи идет ли разрушение пир такой вот штуке, вызывается ли тут деструктор?...


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

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

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