我从 C# 和 Java 背景转向 C++,我试图理解
>>
和 <<
运算符,例如 in
std::cout << "Hello World";
我在这里无法理解的是
<<
运算符的用途。我尝试声明自己的简单函数,它始终返回整数 5
,我可以像在 C# 中那样调用它,
int x = MyFunction();
这会将
x
变成 5
,但为什么我需要将 std::cout
与 <<
一起使用?另外,如果您能帮助我理解 >>
和 <<
的用途,我将非常感激。
感谢大家帮助我理解这一点。真正让我大开眼界的是 std::cout 是一个对象:)
你没有准确地拼写出来,但我相信你的困惑在于你认为
std::cout
是一个函数,并且你想知道为什么你不直接这样调用它:
std::cout("Hello World");
嗯,
std::cout
不是一个函数。该语句中的功能是operator<<
。
std::cout << "Hello World";
或者,更具体地说,该函数是
std::ostream::operator<<(const char*)
。
您需要了解的是,运算符只是具有替代调用语法的函数。
operator<<
被重载为 std::ostream
的成员函数,并且 std::cout
是 std::ostream
的对象。所以这个:
std::cout << "Hello World";
这是另一种称呼方式:
std::cout.operator<<("Hello World");
请注意,
operator<<
是一个二元运算符,这意味着如果它被声明为自由函数,它需要两个参数;如果它被声明为成员函数,它需要一个参数。当您使用替代调用语法时,左侧的对象是第一个参数,右侧的对象是第二个参数。在将其声明为成员函数的情况下,就像在本例中一样,左侧的对象是调用对象,右侧的对象是参数。
如果将其声明为自由函数,它会是这样的:
operator<<(std::cout, "Hello World");
但是,无论它是声明为成员函数还是自由函数,您仍然可以使用相同的替代调用语法。
<<
是左移运算符,>>
是右移运算符,就像 Java 和 C# 中一样。
但是,另外,
<<
被重载以提供一种将值输出到流的方法。流 std::cout
通常指的是启动程序的终端,使用 <<
向该流写入内容会将其写入终端。 >>
同样被重载以从流中读取,并且在流 std::cin
从终端读取程序启动的情况下。
这种事情在 C++ 中有效,因为您为用户定义类型定义了运算符的行为。在 java 中,运算符仅对内置类型进行操作 - 如果
a + b
和 a
是您自己的类的实例,则编写 b
是错误的。在 C++ 中,这是允许的 if 该类定义了合适的运算符 +
。
在 I/O 流的情况下,
<<
和 >>
运算符被重载,意味着除位移位之外的其他含义。例如, std::ostream::operator<< 对于许多类型都是重载的,您也可以为自己的类型添加重载。例如:
#include <string>
#include <iostream>
class my_type {
public:
my_type(const std::string &name) : _name(name) { }
const std::string &get_name() const { return _name; }
private:
std::string _name;
};
std::ostream& operator<< (std::ostream& out, const my_type &foo ) {
return out << foo.get_name();
}
int main() {
my_type m("foo");
std::cout << m; // prints "foo"
return 0;
}
据我所知,c++ 有流
<< is an operator that is an operator that is used to "append data" to a stream
>> 用于从流中提取数据。
当然,您可以使用不仅仅是流的类来实现这一点。
一般来说,
<<
和>>
运算符具有相同的含义。但是,在您给出的情况下,它们分别是流写入和读取运算符。具体来说, <<
是写入操作符(将其视为指向流),>>
是读取操作符(指向远离流)。
它们是通过重载
<<
和 >>
运算符来处理的。特别地,C++范例是分别为<<
和>>
添加ostream
和istream
的重载来处理输入和输出。 C++ 不像 Java 和 C# 那样具有内置的ToString()
范例。
最后,
std::cout
、std::cin
和std::cerr
分别是ostream
、istream
和ostream
的实例,这就是为什么它们获得<<
和>>
重载。
例如,以下代码将
Hello World
输出到标准输出流。
std::cout << "Hello World" << std::endl;
最后,std::endl 是一个特殊的
ostream
,它添加换行符并刷新流。
在 C 和 C++ 中,重载 << operator means "shift left". In C++, when using the standard template library, the << and >> 运算符以实现流 API。
对象 std::cout 确实重载了 << operator to use it as a conversion function (in this case to a string printed to the console).
其实是这样的:
int x = myFunction();
std::cout << x;
还有这个:
std::cout << myFunction();
功能相同(除了临时变量 x 的定义)。