Предыдущий пост -
Следующий пост -

Перегрузка операторов cout и cin

Рубрика: C++, Дата: 19 March, 2013, Автор:
Tags:

Добрый день господа!

Все вы наверно знаете, что такое cout и cin.

cout – это объект потока ostream, то – есть класса ostream, а cin – это объект потока istream, то есть класса istream.

Я мб и ошибаюсь но мне кажется именно так и есть. Так поехали дальше.

Мы будем перегружать глобально operator<<, для того чтобы перегрузить сам вывод для класса. При вызове cout <<a; он будет заменятся на функцию operator<<(cout, a); автоматически. То есть определив функцию ostream& operator<<(ostream&, Str&), то она будет вызываться для класса Str, то есть для пользовательского типа.

Теперь по порядку. Для того чтобы можно использовать типы istream и ostream мы в подключаем заголовочный файл #include <iostream>, далее объявляем using std::istream; using std::ostream;

#include <iostream>
using std::istream;
using std::ostream;

отак от.

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

//перегрузка для cout
ostream& operator<<(ostream& a, const Str& b)
{
  a <<b.s;//где s - это например строка типа char*
  return a;//вернуть поток
}

//перегрузка для cin
istream& operator>>(istream& a, Str&b)
{
  a >>b.s;//где s - это например char*
  return a;//вернуть поток
}

Ну вот определили. В функции operator<< с объектом типа ostream a мы работаем как с обычным cout, а в функции operator<< с объектом типа istream a как с обычным cin.

Для того, чтобы функции могли обращаться к закрытым членам класса функции в классах объявляются как друзьями класса. Если без объявления, то они смогут только к закрытым членам обращаться.

Приведу полный пример:

//peregryzka operatora cout i cin dl9 pol6zovatel6ckogo klacca
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
using std::ostream;
using std::istream;
#include <cstring>
using std::strlen;
using std::strcpy;

class Str
{
	friend ostream& operator<<(ostream&, const Str&);
	friend istream& operator>>(istream&, Str&);
public:
	char* s; //predctavlenie
	//k. po ymolchaniyu
	Str()
	{
		s=new char(strlen("ymolchanie"));
		strcpy(s,"ymolchanie");
	}
};

int main()
{
	Str s;
	cout <<s.s<<endl;
	cout <<s<<' '<<s<<endl;
	operator<<(cout,s);

	cout <<"Vvedite stroky"<<endl;
	cin >>s;
	cout <<s<<endl;

	return 0;
}

ostream& operator<<(ostream& a, const Str& b)
{
	a <<b.s;
        return a;
}

istream& operator>>(istream& a, Str& b)
{
	a >>b.s;
        return a;
}

Так же и для все остальных пользовательских типов перегружается, делаем простую глобальную перегрузку operator<< и operator>>.

Еще одна важная деталь обязательно возвращайте поток return a; , а то я однажды забыл. 🙂 .

Все пока.

rss