Оператор перегрузки [] - PullRequest
       19

Оператор перегрузки []

4 голосов
/ 22 декабря 2010

Допустим, у меня есть контейнерный класс с именем MyContainerClass, который содержит целые числа.Оператор [], как вы знаете, может быть перегружен, так что пользователь может более интуитивно получать доступ к значениям, как если бы контейнер представлял собой обычный массив.Например:

MyContainerClass MyInstance;
// ...
int ValueAtIndex = MyInstance[3]; // Gets the value at the index of 3.

Очевидный тип возврата для operator[] будет int, но тогда пользователь не сможет сделать что-то вроде этого:

MyContainerClass MyInstance;
MyInstance[3] = 5;

Итак, каким должен быть тип возврата для operator[]?

Ответы [ 4 ]

15 голосов
/ 22 декабря 2010

Очевидный тип возврата: int&:)

Для более сложной разработки:

int &operator[](ptrdiff_t i) { return myarray[i]; }

int const& operator[](ptrdiff_t i) const { return myarray[i]; }
// ^ could be "int" too. Doesn't matter for a simple type as "int".
5 голосов
/ 22 декабря 2010

Это должна быть ссылка:

int &
2 голосов
/ 22 декабря 2010
class MyContainerClass {
public:
  int& operator[](unsigned int index);
  int operator[](unsigned int index) const;
  // ...
};

Возврат ссылки позволяет пользователю использовать результат в качестве lvalue, как в вашем примере MyInstance[3] = 5;. Добавление перегрузки const гарантирует, что они не смогут сделать это, если MyInstance является const переменной или ссылкой.

Но иногда вы хотите, чтобы все выглядело так, но на самом деле у вас нет int, на который вы можете сослаться. Или, может быть, вы хотите разрешить несколько типов в правой части MyInstance[3] = expr;. В этом случае вы можете использовать фиктивный объект, который перегружает присваивание:

class MyContainerClass {
private:
  class Index {
  public:
    Index& operator=(int val);
    Index& operator=(const string& val);
  private:
    Index(MyContainerClass& cont, unsigned int ind);
    MyContainerClass& m_cont;
    unsigned int m_ind;
    friend class MyContainerClass;
  };
public:
  Index operator[](unsigned int ind) { return Index(*this, ind); }
  int operator[](unsigned int ind) const;
// ...
};
1 голос
/ 22 декабря 2010

int&

возврат ссылки позволяет также использовать возвращаемое значение в качестве левой части присваивания.

та же причина, по которой operator<<() возвращает ostream&,что позволяет писать cout << a << b;

...