Перегрузка операций
Настоящий класс ostream определяет операцию
Чтобы определить @, где @ - некоторая операция языка C++,
для каждого определяемого пользователем типа вы определяете функцию с именем
operator@, которая получает параметры соответствующего типа. Например:
class ostream {
//...
ostream
operator
};
ostream ostream::operator
{
while (*p)
buf.sputc(*p++);
return *this;
}
определяет операцию
а если применить операцию взятия адреса, то вы получите
адрес объекта, на который ссылается ссылка:
&s1 == &my_out
Первая очевидная польза от ссылок состоит в том, чтобы
обеспечить передачу адреса объекта, а не самого объекта, в функцию вывода (в
некоторых языках это называется передачей параметра по ссылке):
ostream& operator
return s
}
Достаточно интересно, что тело функции осталось без
изменений, но если вы будете осуществлять присваивание s, то будете
воздействовать на сам объект, а не на его копию. В данном случае то, что
возвращается ссылка, также повышает эффективность, поскольку очевидный способ
реализации ссылки - это указатель, а передача указателя гораздо дешевле, чем
передача большой структуры данных.
Ссылки также существенны для определения потока ввода,
поскольку операция ввода получает в качестве операнда переменную для
считывания. Если бы ссылки не использовались, то пользователь должен был бы
явно передавать указатели в функции ввода.
class istream {
//...
int state;
public:
istream&
operator>>(char≈);
istream&
operator>>(char*);
istream&
operator>>(int&);
istream&
operator>>(long&);
//...
};
Заметьте, что для чтения long и int используются разные
функции, тогда как для их печати требовалась только одна. Это вполне обычно, и
причина в том, что int может быть преобразовано в long по стандартным правилам
неявного преобразования, избавляя таким образом программиста от беспокойства по
поводу написания обеих функций ввода.
Список литературы
Для подготовки данной работы были использованы материалы
с сайта http://www.realcoding.net