Перегрузка операций

2212
знаков
0
таблиц
0
изображений

Настоящий класс ostream определяет операцию <<, чтобы сделать удобным вывод нескольких объектов одним оператором. Давайте посмотрим, как это сделано.

Чтобы определить @, где @ - некоторая операция языка C++, для каждого определяемого пользователем типа вы определяете функцию с именем operator@, которая получает параметры соответствующего типа. Например:

class ostream {

//...

ostream operator<<(char*);

};

ostream ostream::operator<<(char* p)

{

while (*p) buf.sputc(*p++);

return *this;

}

определяет операцию << как член класса ostream, поэтому s< ");

а если применить операцию взятия адреса, то вы получите адрес объекта, на который ссылается ссылка:

&s1 == &my_out

Первая очевидная польза от ссылок состоит в том, чтобы обеспечить передачу адреса объекта, а не самого объекта, в функцию вывода (в некоторых языках это называется передачей параметра по ссылке):

ostream& operator<<(ostream& s, complex z) {

return s << "(" << z.real << "," << z.imag << ")";

}

Достаточно интересно, что тело функции осталось без изменений, но если вы будете осуществлять присваивание s, то будете воздействовать на сам объект, а не на его копию. В данном случае то, что возвращается ссылка, также повышает эффективность, поскольку очевидный способ реализации ссылки - это указатель, а передача указателя гораздо дешевле, чем передача большой структуры данных.

Ссылки также существенны для определения потока ввода, поскольку операция ввода получает в качестве операнда переменную для считывания. Если бы ссылки не использовались, то пользователь должен был бы явно передавать указатели в функции ввода.

class istream {

//...

int state;

public:

istream& operator>>(char&ap;);

istream& operator>>(char*);

istream& operator>>(int&);

istream& operator>>(long&);

//...

};

Заметьте, что для чтения long и int используются разные функции, тогда как для их печати требовалась только одна. Это вполне обычно, и причина в том, что int может быть преобразовано в long по стандартным правилам неявного преобразования, избавляя таким образом программиста от беспокойства по поводу написания обеих функций вво


Информация о работе «Перегрузка операций»
Раздел: Информатика, программирование
Количество знаков с пробелами: 2212
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
668870
13
0

... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...

Скачать
19356
0
1

... : AT) — операция, при которой матрица отражается относительно главной диагонали, то есть Если A — матрица размера , то AT — матрица размера . 1.2 C++ C++ (Си++) — компилируемый статически типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования, но, в сравнении с его предшественником — языком Си, — наибольшее внимание уделено поддержке ...

Скачать
26125
1
0

... в языке C). Таким образом, эволюцию языков можно показать на схеме: Коды Ассемблеры Языки высокого Объектно-ориентированное и уровня  модульное программирование 2. Основы объектно-ориентированного программирования: Объектно-ориентированное программирование – это самый высокоуровневый вид программирования в настоящее время. Здесь поддерживаются достижения предыдущих поколений и ...

Скачать
41510
0
0

... . Например, не существует типа матрица с операцией обращения или типа строка с операцией конкатенации. Если пользователю понадобятся подобные типы, он может определить их в самом языке. Программирование на С++ по сути сводится к определению универсальных или зависящих от области приложения типов. Хорошо продуманный пользовательский тип отличается от встроенного типа только способом определения, но ...

0 комментариев


Наверх