среда, 16 января 2013 г.

Перегрузка оператора [] C++


Сегодня я рассмотрю пример перегрузки оператора для класса, где одним из полей является массив шаблонного типа, а сам класс-шаблонный.
Вспомним какие перегруженные операторы должны быть обязательно членами класса, какие нет.
Из таблицы видно, что оператор [] должен быть обязательно членом класса, то есть никаких friend'ов и так далее. Вспомним, что, если какой-то operator (оператор) является членом класса, то this является неявным аргументом.
Например, если оператор+ член класса, то мы его записываем так:
R T::operator +(S b);
Если, friend, то:
R operator +(S a, T b);

Теперь разберемся зачем нам использовать ссылку для возврата. Мы ее используем в том случае, когда не хотим, чтобы создавался временный объект и он возвращался, а возвращалась ссылка на измененный объект.

Класс:

template < typename Type>
class A {
private:
 Type *mas;
 unsigned _size;
public:
 A (unsigned size){
  _size=size;
  mas=new Type[_size];
  for (unsigned i=0; i< _size; i++){
   mas[i]=i;
  }
 }
 Type& operator[](const unsigned index) const;
};
Теперь само определение перегруженного оператора:

template < typename Type> Type& A< Type>::operator[](const unsigned index) const{
 try { //поискать ошибку
  if (index< 0||index>_size){
   throw("out of range"); //вбросить
  }
  return mas[index]; //возвратить элемент
 }
 catch(const char *msg){ //поймать ошибку
  puts(msg);
  exit(1);
 }
}
Код для проверки:

unsigned x;
cout< < "Enter size of mas: ";
cin>>x;
A< unsigned> a(x);
cout< < endl;
for (unsigned i=0; i< x; i++){
 cout< < "Element: "< < i< < "  "< < a[i]< < endl;
}
Демонстрация:

0 коммент.:

Отправить комментарий