При использовании библиотеки ввода-вывода необходимо помнить, что в C++ классы ввода-вывода используют операции: включение в поток, исключение из потока. Эти операции используются только для стандартных типов данных. Поэтому, при разработке программ для определяемых пользователем типов полей класса и для классов целиком при выводе объектов этих классов операции включения/исключения должны переопределяться для каждого класса.
Формат операций включения/исключения из потока:

ostream &operator << (ostream &out, <новый тип> <имя>)
{<тело функции оператора>};
istream &operator >> (istream &in, <новый тип> <<мя>)
{<тело функции оператора>};

Если операции включения/исключения используются для полей описания, как private или protected, то эти операции должны описываться как дружественные.

Пример 1
#include<iostream.h>
#include<conio.h>

class Tadress
{
private:
char country[16];
char city[16];
char street[20];
int  housenum;

public:
Tadress(){}
~Tadress(){}
friend ostream  &operator << (ostream &out, Tadress obj);
friend istream  &operator >> (istream &in, Tadress &obj);
};

ostream &operator << (ostream &out, Tadress obj) /* тело функции переопределяет вставки в поток */
{
out << "Address: "<< endl;
out << "Country: "<< obj.country<< endl;
out << "City:"<< obj.city<< endl;
out << "House:"<< obj.housenum<< endl;

return out;
}

istream &operator >> (istream &in, Tadress &obj) /* тело функции переопределяет исключения из потока */
{
cout<<"введите адрес следующим образом:";
cout<<" <<страна>> <<город>> <<улица>> <<номер дома>>"<<endl;

in >> obj.country >> obj.city >> obj.street >> obj.housenum ;

return in;
}

void main()
{
clrscr();
Tadress a, b;
cin >> a >> b;
cout << a << b;
getch();
}