Оператор вставки не производит ожидаемый выход?
Вот код
#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<<
.