В предыдущих главах мы уже показывали, что перегрузка операторов позволяет программисту вводить собственные версии предопределенных операторов (см. главу 4) для операндов типа классов. Например, в классе String из раздела 3.15 задано много перегруженных операторов. Ниже приведено его определение:
#include <iostream>
class String;
istream& operator>>( istream &, const String & );
ostream& operator<<( ostream &, const String & );
class String {
public:
// набор перегруженных конструкторов
// для автоматической инициализации
String( const char* = 0 );
String( const String & );
// деструктор: автоматическое уничтожение
~String();
// набор перегруженных операторов присваивания
String& operator=( const String & );
String& operator=( const char * );
// перегруженный оператор взятия индекса
char& operator[]( int );
// набор перегруженных операторов равенства
// str1 == str2;
bool operator==( const char * );
bool operator==( const String & );
// функции доступа к членам
int size() { return _size; };
char * c_str() { return _string; }
private:
int _size;
char *_string;
};
В классе String есть три набора перегруженных операторов. Первый – это набор операторов присваивания:
// набор перегруженных операторов присваивания
String& operator=( const String & );
String& operator=( const char * );
Сначала идет копирующий оператор присваивания. (Подробно они обсуждались в разделе 14.7.) Следующий оператор поддерживает присваивание C-строки символов объекту типа String:
String name;
name = "Sherlock"; // использование оператора operator=( char * )
(Операторы присваивания, отличные от копирующих, мы рассмотрим в разделе 15.3.)
Во втором наборе есть всего один оператор – взятия индекса: