Одним словом, оператор << <strong>перегружен (очень распространенная функция c ++).
Как и другие методы, операторы могут быть перегружены, и, как намекал Мартин Йорк в своем ответе, операторы - это не больше, чем методы, которые компилятор вызывает при разборе операнда и выражения оператора.
В результате получается, что при применении к операндам типа integer и тому подобному
cout - это объект типа ostream . Смотрите подробности для его ostream :: operator << </strong>
Эффективно ostream :: operator << перезагружается несколько раз для каждого из возможных типов его второго аргумента (справа). Это позволяет наполнять поток различными типами и не указывать формат. Этот оператор возвращает ostream, который позволяет объединить несколько << вместе. </p>
Причина, по которой << был выбран для оператора ostream, заключается в том, что он позволяет отображать в строковом коде вещи в том же порядке, в каком они будут отображаться в выводе: </p>
cout << "Found " << nbOfCats << " cats in the " << barnName << "barn.";
считается, что его легче читать, и он также менее подвержен ошибкам, чем, скажем,
printf("Found %ld cats in the %s barn.", nbOfCats, barnName);