Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.62
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
01.06.2011, 21:50     Возврат значения по ссылке #1
Долго гуглил, но что-то так и не понял. Почему слева от знака = может использоваться только функция, возвращающая ссылку?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 21:50     Возврат значения по ссылке
Посмотрите здесь:

Наследование, возврат по ссылке.. C++
Возврат значения из функции C++
Возврат значения С++ C++
Тернарный оператор: возврат значения C++
Возврат значения функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
besstiaa
 Аватар для besstiaa
93 / 93 / 7
Регистрация: 04.06.2010
Сообщений: 223
01.06.2011, 22:33     Возврат значения по ссылке #2
Это о чем речь?)) Пример?
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
01.06.2011, 22:35     Возврат значения по ссылке #3
погугли на темы lvalue rvalue.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 22:38     Возврат значения по ссылке #4
f() = 1;
Так что ли? Советую не извращаться таким способом.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
01.06.2011, 22:47     Возврат значения по ссылке #5
это не извращения, это стандартный способ для записи выражений типа
C++
1
2
i=j=k=10;
cout << i << k << l << '\n';
без возврата по ссылке эти операции были бы невыполнимы
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 22:51     Возврат значения по ссылке #6
OstapBender, речь шла о знаке =
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
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, который затем их возвратит. Для получения лучшего результата используйте
в этих функциях возврат по ссылке, чтобы они могли быть использованы
с левой стороны знака «равно» для изменения части существующей строки.

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

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

Цитата Сообщение от slice Посмотреть сообщение
припася, скорее всего, в кармане тезис "Оператор - это тоже функция"
и что? потому что так и есть
и arr[i]=0; хороший пример.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
01.06.2011, 23:52     Возврат значения по ссылке #17
OstapBender, и чё?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
01.06.2011, 23:55     Возврат значения по ссылке #18
OstapBender, имелся ввиду внешний вид, а не содержание.
Тут как говорится на вкус и цвет. По моему мнению функция для матрицы Element& get(X, Y) меньшее извращение, чем две функции Element get(X, Y) и set(X, Y, Element), и уж куда меньшее извращение, чем вспомогательные классы для записи [][].
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2011, 10:52     Возврат значения по ссылке
Еще ссылки по теме:

C++ Возврат значения из operator=
Как происходит возврат значения по ссылке? C++
Возврат по ссылке C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.06.2011, 10:52     Возврат значения по ссылке #19
gooseim, А по-моему мнению более удобно перегрузить оператор () (X, Y)... Хотя и get и get/set тоже неплохо. По крайней мере get будет константной возвращающей конст ссылку, а set неконстантной ничего не возвращающей. Что несколько более понятно. Функция должна выполнять только 1 вещь (что не всегда возможно впринципе).
Yandex
Объявления
02.06.2011, 10:52     Возврат значения по ссылке
Ответ Создать тему
Опции темы

Текущее время: 00:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru