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

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

Войти
Регистрация
Восстановить пароль
 
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 171
#1

Перегрузка оператора индексирования - C++

15.11.2012, 21:15. Просмотров 713. Ответов 8
Метки нет (Все метки)

Собсно код с книжки списал. Понятно что данный класс на векторе построен (понятно, что можно на основе любого контейнера зафигачить), однако остается большим вопрос зачем обязательно ДВА оператора индексирования, зачем их перегружать, зачем нужно именно ДВА варианта?
Ну и так же непонятно зачем было ссылку писать а не int в операторах, и зачем столько слов const....
Вроде все работает, но мелочи.... мелочи убивают просто.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Oracule
      {
      public:
      Oracule():as(100)
              {
              for(int ix=0;ix!=100;++ix) as[ix]=ix;
              }
      int& operator[](const size_t);
      const int& operator[](const size_t) const;
      private:
      vector<int> as;            
      };
 
int& Oracule::operator[](const size_t index)
     {
     return as[index];
     }  
const int& Oracule::operator[](const size_t index) const
     {
     return as[index];
     }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 22:02     Перегрузка оператора индексирования #2
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
#include <iostream>
#include <vector>
 
class Oracule
{
public:
    Oracule():as(100)
    {
        for(int ix=0;ix!=100;++ix) as[ix]=ix;
    }
    int& operator[](const size_t);
    const int& operator[](const size_t) const;
private:
    std::vector<int> as;            
};
 
int& Oracule::operator[](const size_t index)
{
    return as[index];
}  
const int& Oracule::operator[](const size_t index) const
{
    return as[index];
}    
 
int main()
{
    Oracule one;
    const Oracule two;
    std::cout<<"one[10] = "<<one[10]<<std::endl;
    std::cout<<"two[10] = "<<two[10]<<std::endl; // без const int& operator[](const size_t) const проблема
    system("pause");
    return 0;
}
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:08     Перегрузка оператора индексирования #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
int& Oracule::operator[](const size_t index)
этот const не имеет смысла
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
15.11.2012, 22:18     Перегрузка оператора индексирования #4
C++
1
int& Oracule::operator[](const size_t index)
без этого метода не получится изменить значение в векторе с помощью оператора индексирования
C++
1
2
Oracule a;
a[0] = 1; //int& Oracule::operator[](const size_t index)
а без конст метода не получится обращаться к константному объекту
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
15.11.2012, 22:42     Перегрузка оператора индексирования #5
Цитата Сообщение от Jupiter Посмотреть сообщение
этот const не имеет смысла
По мне так вполне имеет. Вот в прототипе действительно бессмысленно его указывать.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 22:45     Перегрузка оператора индексирования #6
Цитата Сообщение от gray_fox Посмотреть сообщение
По мне так вполне имеет.
в чем же?
параметр передается по значению потому от этого const ни холодно, ни жарко
только глаз режет и с толку сбивает - "а что автор хотел сказать этим const?"
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 171
15.11.2012, 22:54  [ТС]     Перегрузка оператора индексирования #7
Цитата Сообщение от yuron_477 Посмотреть сообщение
std::cout<<"two[10] = "<<two[10]<<std::endl; // без const int& operator[](const size_t) const проблема
И понял и нифига не понял, почему в поток надо именно константу кидать?
Вот же нормально всегда выводило
C++
1
2
int a=123;
cout<<a;
С одним вопросом раобрался, почему int& сидел рисовал.... =)
Вот наваял в паинте
Перегрузка оператора индексирования
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
15.11.2012, 22:57     Перегрузка оператора индексирования #8
Цитата Сообщение от Jupiter Посмотреть сообщение
"а что автор хотел сказать этим const?"
То что он не будет менять значение переменной (да, кэп). Согласен, что выглядит излишним, но, ИМХО, может помочь избежать мелких ошибок.

Добавлено через 51 секунду
В любом случае на сигнатуру это не влияет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 23:05     Перегрузка оператора индексирования
Еще ссылки по теме:

Аналог перегрузки оператора индексирования (operator []) C++
Перегрузка оператора ++ C++
C++ Перегрузка оператора [][]
Перегрузка индексирования строками C++
C++ Перегрузка оператора индексирования

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.11.2012, 23:05     Перегрузка оператора индексирования #9
Цитата Сообщение от gray_fox Посмотреть сообщение
То что он не будет менять значение переменной
или то что автор писал код "не в сознании" и упустил звездочку/амперсанд.
со стороны это в большинсве случаев будет выглядить именно так.
нужна именно константа? создай её локалько
Yandex
Объявления
15.11.2012, 23:05     Перегрузка оператора индексирования
Ответ Создать тему
Опции темы

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