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

Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
16.05.2011, 16:17     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #1
Сабж.
Ну, то есть есть класс, что-то такое:
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
#include <iostream>
using namespace std;
 
class arr
{
  public:
    explicit arr(int number) {
     array= new int [number];
     for (int i= 0; i< number;i++) array[i]= i* i;
    };
    //int operator[] (int i){return array[i];};
    int& operator[] (int i){return array[i];};
 
    ~arr(){delete array;}
 
  private:
    int *array;
};
 
int main () { 
 arr a(6);
 int r= a[2];
 cout<<r <<endl;
 getchar();
 return 0;
}
Есть перегруженный оператор [], он возвращает int, а у меня в книге написано, что надо возвращать ссылку на int

Я так подумал- мы ничё во втором случае не выиграем.
Итак, возвращаем ссылку. Размер тот же, что у int, да плюс ко всему её ещё и разыменовывать надо;
двойная работа. А int вернул и получил готовое значение.

А если компилятор трактует возврат ссылки как СРАЗУ возврат значения, опять ничё не выигрываем, что так возвратится int, что эдак. Правильно я думаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2011, 16:17     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку?
Посмотрите здесь:

Зачем нужен const при перегрузке оператора C++
C++ Ошибка в перегрузке оператора - при работе с массивами
C++ Почему перегруженный оператор = должен возвращать ссылку на объект
C++ Ошибка при перегрузке оператора, не знаю как исправить
& при перегрузке оператора ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
16.05.2011, 16:20     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #2
возвращенный по ссылке элемент можно редактировать, при этом редактирование отразится в объекте класса, если возвращать по значению, то будет предоставлена только копия, т.е. будет только для чтения.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
16.05.2011, 16:21     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #3
Цитата Сообщение от kravam Посмотреть сообщение
Я так подумал- мы ничё во втором случае не выиграем.
А вы попробуйте возвращать не ссылку и поставить a[2] в левую часть оператора присваевания.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2011, 18:39     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #4
Ничего необходимого тут нет. Только если нужно изменять. Для константной версии оператора ссылка нафиг не нужна
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.05.2011, 20:26     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #5
ForEveR, ну тут всё, опять же, зависит от того, что хранится в контейнере. Если контейнер шаблонный, лучше всё же возвращать ссылку, ибо при инстанцировании в качестве типа может быть указан другой класс, объекты которого могут быть довольно громоздкими, чтобы возвращать их по значению, а не по ссылке.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2011, 21:24     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? #6
silent_1991, Ну да. Соглашусь.
Yandex
Объявления
16.05.2011, 21:24     Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку?
Ответ Создать тему
Опции темы

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