2010-12-06 2 views
1

Я пытаюсь понять, что на самом деле происходит, когда я компилирую и выполняю код на C++, но строка cout << "output"; меня немного смущает.Что происходит, когда вы выполняете `cout <<" output ";` в C++?

Я знаю, что <<, является оператором побитового leftshift, и что выполнение y = x << 6 присвоит значение y, полученное в результате сдвига x влево на шесть бит.

Я также знаю, что «< <», по отношению к потокам, является оператором вставки, и что выполнение cout << "output"; вставляет строку output в объект cout.

То, что я хочу знать, является ли это пример перегрузки <<, или если cout действительно сдвигается влево на значение, которое соответствует количеству битов, занимаемых строкой output. Если output действительно просто вставлен в cout через перегрузку <<, то почему используется побитовый оператор, а не оператор присваивания =, что было бы более интуитивно понятным?

Вопрос: Как cout << "output" разместить слово «выход» на экране терминала?

+4

«Я видел, как« cout »смещается« Hello world »раз влево и останавливается прямо там». – 2010-12-06 22:57:12

+0

Я не понимаю, почему вы думаете, что перегрузка `=` будет более интуитивной. – 2010-12-06 23:35:40

+0

cout и iostream предшествуют стандартной библиотеке C++ и были очень распространены. Он застрял, с несколькими незначительными отличиями. Обычно вы перегружаете оператора, чтобы он имел то же общее значение, что и предполагалось. – CashCow 2014-08-13 16:39:31

ответ

7

Одним словом, < < оператор перегружен (очень распространенная функция C++).
Как и другие методы, операторы могут быть перегружены и, как намекнул Мартин Йорк в своем ответе, операторы - это не что иное, как методы, которые компилятор вызывает при анализе операнда и выражения оператора.

Случается, что при применении к операндам типа integer и таким образом < < имеет «типичную», побитовую семантику оператора, когда применяется к потоку с семантикой «printf-like».

cout - объект типа ostream. См. Подробности о его ostream::operator<<

Фактически ostream :: operator < < < загружается несколько раз, для каждого из возможных типов его второго аргумента (с правой стороны). Это позволяет подавать поток с различными типами и не указывать формат. Этот оператор возвращает поток, который позволяет связать несколько < < вместе.

Причина < < был выбран для оператора ostream является то, что это позволяет показывать в строке кода вещи в том же порядке, как они будут появляться на выходе:

cout << "Found " << nbOfCats << " cats in the " << barnName << "barn."; 

это, как полагают, будет проще читать, а также менее подвержены ошибкам, чем, скажем

printf("Found %ld cats in the %s barn.", nbOfCats, barnName); 
+0

Я бы сказал, что printf более читабельна. Синтаксис `<<` слишком похож на использование операторов конкатенации строк в PHP и таких: `echo 'blah'. $ Var." Blah ". $ Var2` – erjiang 2010-12-06 23:21:19

1

Это сбивает с толку, потому что оператор побитовое не на самом деле используется в данном случае. Они использовали перегрузку оператора просто потому, что < < выглядит хорошо и легко читается в коде.

0

Он не помещает слово «выход» на экран терминала, он помещает его в буфер сначала. Когда буфер сбрасывается, отображается только слово на экране терминала.

2

Да, это перегрузка.

Оператор << был использован для вывода, потому что он вместе с >> для ввода, имеет мнемоническое значение (легко запоминается) и низкий приоритет (таким образом, большинство видов выражений как аргументов без добавленных круглых скобок).

Что происходит подробно, на самом деле довольно сложно. Единственное, что иногда препятствует новичкам на C++, состоит в том, что некоторые из перегрузок << являются автономными функциями и некоторыми нестационарными функциями-членами. Например. когда вы создаете временный объект ostringstream, а затем используя <<, этот вызов может быть разрешен только для перегрузки функции-члена, поскольку временный объект не может быть привязан к аргументу формальной ссылки-не-const автономных перегрузок функций. Почему это так, я думаю, никто не знает, возможно, просто плохую историю. Кажется, я помню, что некоторые из них были исправлены в C++ 0x, но я не уверен (проверьте, если это важно). .

Приветствия & НТН,

0

Streams:

std::cout << std::string("Plop"); 

Это синтаксический сахар для вызова метода:

std::ostream& operator<<(std::ostream& str, std::string const& data) 
{ 
    // Do Stuff 
    return str; 
} 

Как сделать материал делает его вещь не определен стандарт он просто работает.

Но, вероятно, он просто делает:

write(2, data.c_str(), data.length()); 

Где 2 является дескриптор файла для выходного потока. Выходной поток подключается к приложению ОС, поэтому, когда приложение записывает в этот поток, ОС может считывать данные. То, что ОС делает с данными, полностью зависит от ситуации.

Но если вы запустили приложение из командной строки, оно, вероятно, подключило выходной поток из приложения к терминалу, а затем ответственность терминала за то, что делать с данными (игнорировать, печатать и т. Д.), и полностью зависит от приложения терминала.

Смежные вопросы