Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
#1

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

16.05.2011, 16:17. Просмотров 830. Ответов 5
Метки нет (Все метки)

Сабж.
Ну, то есть есть класс, что-то такое:
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, что эдак. Правильно я думаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2011, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Уточняющий вопрос: почему при перегрузке оператора [] необходимо возвращать ссылку? (C++):

Почему при перегрузке оператора присваивания, возвращаемое значение не константно? - C++
Почему при перегрузке оператора присваивания, возвращаемое значение - someClass &amp; operator=(const someClass&amp; rhl), а не const someClass &amp;...

Почему перегруженный оператор = должен возвращать ссылку на объект - C++
Объясните доступно пожалуйста. Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как...

Ошибка при перегрузке оператора >> - C++
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape { protected: Color figureCol; ...

Ошибка при перегрузке оператора + - C++
Имеется класс, который представляет из себя строку и количество символов в ней. Задача - перегрузить оператор +, чтобы он складывал нам две...

Предупреждение при перегрузке оператора - C++
Есть вот такой код для созданный для обучения #include &lt;iostream&gt; using namespace std; class complex{ private: ...

& при перегрузке оператора ввода - C++
Скажите почему без &amp; не будет работать? ostream&amp; operator&lt;&lt;(ostream &amp;stream,MyClass obj) { stream&lt;&lt;obj.a&lt;&lt;endl; return stream; ...

5
oxotnik
1591 / 1068 / 33
Регистрация: 21.08.2008
Сообщений: 4,464
Записей в блоге: 1
16.05.2011, 16:20 #2
возвращенный по ссылке элемент можно редактировать, при этом редактирование отразится в объекте класса, если возвращать по значению, то будет предоставлена только копия, т.е. будет только для чтения.
1
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
16.05.2011, 16:21 #3
Цитата Сообщение от kravam Посмотреть сообщение
Я так подумал- мы ничё во втором случае не выиграем.
А вы попробуйте возвращать не ссылку и поставить a[2] в левую часть оператора присваевания.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.05.2011, 18:39 #4
Ничего необходимого тут нет. Только если нужно изменять. Для константной версии оператора ссылка нафиг не нужна
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.05.2011, 20:26 #5
ForEveR, ну тут всё, опять же, зависит от того, что хранится в контейнере. Если контейнер шаблонный, лучше всё же возвращать ссылку, ибо при инстанцировании в качестве типа может быть указан другой класс, объекты которого могут быть довольно громоздкими, чтобы возвращать их по значению, а не по ссылке.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.05.2011, 21:24 #6
silent_1991, Ну да. Соглашусь.
0
16.05.2011, 21:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2011, 21:24
Привет! Вот еще темы с ответами:

Ошибка при перегрузке оператора cin >> - C++
#include &lt;iostream&gt; using namespace std; /////////////////////////////////////////////////////////// class fraction { ...

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

Ошибка при перегрузке оператора вывода в файл - C++
Добрый день, есть такой кусок кода: #include &lt;iostream&gt; #include &lt;ostream&gt; using std::ostream; using namespace std; ...

Константность ссылки в параметре при перегрузке оператора - C++
Здравствуйте! При создании класса комплексные числа операцию сложения определяю так complex operator + (complex&amp;a) { return...


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

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

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