Оператор вставки не производит ожидаемый выход?

Вот код

#include<iostream>
using namespace std;
main()
{
    cout<<"Hellow World"<<endl;
    cout.operator<<("Hellow World");
    cout.operator<<(endl);
}

Я знаю, что cout<<"Hellow World"<<endl; интерпретируется как  cout.operator<<("Hellow World"); Но этот код дает следующие результаты.

Hellow World

0x8048830

если я использую operator<<(cout,"Hellow World"); работает отлично в чем разница между cout.operator<<("Hellow World"); и operator<<(cout,"Hellow World");

Ответ 1

std::basic_ostream перегружает operator<< в две группы, участники и не являющиеся члены.

Разница связана с тем, что при написании cout<<"Hellow World"<<endl; для вывода строкового литерала выбирается не-членная перегрузка const char*.

Когда вы вызываете версию участника, наилучшим образом подходит только перегрузка void*.

Ответ 2

какая разница между cout.operator<<("Hellow World"); и operator<<(cout, "Hellow World");

Когда вы пишете cout.operator<<("Hellow World");, вы вызываете метод operator<< и передаете const char *. Поскольку этот метод не перегружен, чтобы взять const char *, но перегружен, чтобы взять const void *, тот, который вы вызываете, и получите 0x8048830 (который является адресом символа 'H' в вашей строке).

Когда вы пишете operator<<(cout, "Hellow World"), вы вызываете свободную функцию operator<<, которая берет выходной поток с левой стороны и const char * в правой части. Там существует такая функция, и она имеет следующее выражение (упрощенное):

std::ostream& operator<<(std::ostream& os, const char *s);

Итак, вы печатаете последовательность символов, начинающуюся с s, и заканчиваетесь в первом '\0', который встречается (поэтому вы получаете Hellow, world).

Наконец, когда вы пишете std::cout << "Hello, world" << std::endl;, поскольку вы передаете от const char * до operator<<, свободная функция, являющаяся идеальным сочетанием, выбирается по методу operator<<.