Что происходит, когда вы выполняете `cout <<" output ";` в C ++? - PullRequest
1 голос
/ 07 декабря 2010

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

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

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

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

Вопрос : Как cout << "output" помещает слово «output» на экран моего терминала?

Ответы [ 5 ]

7 голосов
/ 07 декабря 2010

Одним словом, оператор << <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);
2 голосов
/ 07 декабря 2010

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

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

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

Приветствия & hth.,

1 голос
/ 07 декабря 2010

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

0 голосов
/ 07 декабря 2010

Потоки:

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

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

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

То, как работает объект Do, не определяется стандартом, который он работает.1007 *

Но, вероятно, это так:

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

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

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

0 голосов
/ 07 декабря 2010

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

...