"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора

(private) часть, содержащую информацию, которой может пользоваться
только его разработчик, и открытую (public) часть, представляющую
интерфейс типа с пользователем:

class ostream {
streambuf* buf;
int state;
public:
void put(char*);
void put(long);
void put(double);
}

Описания после метки public задают интерфейс: пользователь может
обращаться только к трем функциям put(). Описания перед меткой
public задают представление объекта класса ostream; имена buf и
state могут использоваться только функциями put(), описанными в
открытой части.
class определяет тип, а не объект данных, поэтому чтобы
использовать ostream, мы должны один такой объект описать (так же,
как мы описываем переменные типа int):

ostream my_out;

- стр 33 -

Считая, что my_out был соответствующим образом проинициализирован
(как, объясняется в #1.10), его можно использовать например так:

my_out.put("Hello, world\n");

С помощью операции точка выбирается член класса для данного
объекта этого класса. Здесь для объекта my_out вызывается член
функция put().
Функция может определяться так:

void ostream::put(char* p)
{
while (*p) buf.sputc(*p++);
}

где sputc() - функция, которая помещает символ в streambuf.
Префикс ostream необходим, чтобы отличить put() ostream'а от других
функций с именем put().
Для обращения к функции члену должен быть указан объект класса. В
функции члене можно ссылаться на этот объект неявно, как это
делалось выше в ostream::put(): в каждом вызове buf относится к
члену buf объекта, для которого функция вызвана.
Можно также ссылаться на этот объект явно посредством указателя с
именем this. В функции члене класса X this неявно описан как X*