我正在尝试理解编译和执行C ++代码时发生的事情,但cout << "output";
行让我感到有些困惑。
我知道<<
运算符是按位leftshift运算符,并且执行y = x << 6
会将值y
分配给x
左移六位。
我也知道'&lt;&lt;',关于流,是插入运算符,执行cout << "output";
将字符串output
插入对象cout
。< / p>
我想知道的是,这是否是<<
重载的示例,或者cout
是否真的被向左移动了一个与占用的位数相对应的值字符串output
。如果output
真的只是通过cout
的重载插入<<
,那么为什么使用了按位运算符而不是赋值运算符=
,这将是更直观了吗?
问题:cout << "output"
如何在终端屏幕上放置“输出”一词?
答案 0 :(得分:7)
总之,&lt;&lt;运算符过载(一种非常常见的c ++功能) 就像其他方法一样,运算符可能会过载,正如Martin York在他的响应中暗示的那样,运算符只不过是编译器在解析操作数和运算符表达式时调用的方法。
当应用于整数类型的操作数时,会发生什么?&lt;&lt;具有“典型”的按位运算符语义,当应用于流时,它具有“类似printf”的语义。
cout是 ostream 类型的对象。查看其ostream::operator<<
的详细信息有效地ostream :: operator&lt;&lt;对于其第二个参数的每个可能类型(在其右侧),多次超载。这允许馈送具有各种类型的流而不必指定格式。该运算符返回一个ostream,它允许链接几个&lt;&lt;在一起。
&lt;&lt;&lt;&lt;&lt;&lt;&lt;为ostream运算符选择的是允许在行代码中显示与它们在输出中出现的顺序相同的顺序:
cout << "Found " << nbOfCats << " cats in the " << barnName << "barn.";
这被认为更容易阅读,并且比
更容易出错 printf("Found %ld cats in the %s barn.", nbOfCats, barnName);
答案 1 :(得分:2)
是的,它正在超载。
<<
运算符用于输出,因为它与>>
一起用于输入,具有助记符值(易于记忆)和低优先级(因此允许大多数类型的表达式作为参数而不添加括号)。
细节上发生的事实上非常复杂。有时会让C ++新手感到困惑的一件事是<<
的一些重载是独立函数和一些非静态成员函数。例如。当您使用ostringstream
构造临时<<
对象时,此调用只能解析为成员函数重载,因为临时对象无法绑定到正式引用到非{{1独立函数重载的参数。为什么会这样,我想没有人知道,可能只是糟糕的历史。我似乎记得其中一些是在C ++ 0x中修复的,但我不确定(检查它是否重要)。
干杯&amp;第h。,
答案 2 :(得分:1)
这很令人困惑,因为在这种情况下实际上并没有使用按位运算符。他们使用运算符重载只是因为&lt;&lt;在代码中看起来很好并且可读。
答案 3 :(得分:0)
它不会在终端屏幕上放置“输出”一词,而是首先将其放入缓冲区。当缓冲区刷新时,只显示终端屏幕上的字。
答案 4 :(得分:0)
流:
std::cout << std::string("Plop");
这是用于调用方法的语法糖:
std::ostream& operator<<(std::ostream& str, std::string const& data)
{
// Do Stuff
return str;
}
Do的东西是如何做的,它没有被它正常工作的标准所定义。
但可能只是这样:
write(2, data.c_str(), data.length());
其中2是输出流的文件描述符。输出流通过OS连接到应用程序,因此当应用程序写入此流时,OS可以读取数据。操作系统对数据的作用完全取决于具体情况。
但是如果你从命令行启动应用程序它可能将应用程序的输出流连接到终端,那么终端负责如何处理数据(忽略它,打印它等)和完全取决于终端应用程序。