C++中的<<运算符是什么?

What is the << operator for in C++?

本文关键字:lt 是什么 运算符 中的 C++      更新时间:2023-10-16

我来自C#和Java的C++背景,我正在努力理解>>&<<操作员,如

std::cout << "Hello World";

这里我不能理解的是<<运算符的作用。我试着声明我自己的简单函数,它总是返回整数5,我可以像在C#、中那样调用它

int x = MyFunction();

这就把x变成了5,但为什么我需要把std::cout<<一起使用呢?如果你能帮助我理解>><<的作用,我将不胜感激。

感谢你们帮助我理解这一点。真正让我大开眼界的是,std::cout是和object:)

你没有准确地拼写出来,但我相信你的困惑是你认为std::cout是一个函数,你想知道为什么不这样调用它:

std::cout("Hello World");

std::cout不是一个函数。该语句中的函数为operator<<

std::cout << "Hello World";

或者,更具体地说,函数是std::ostream::operator<<(const char*)

您需要理解的是,运算符只是具有替代调用语法的函数。operator<<被重载为std::ostream的成员函数,而std::coutstd::ostream的对象。所以这个:

std::cout << "Hello World";

是另一种称之为的方法吗

std::cout.operator<<("Hello World");

请注意,operator<<是一个二进制运算符,这意味着如果它被声明为自由函数,它需要两个参数,如果它被宣布为成员函数,则需要一个参数。使用替代调用语法时,左侧的对象是第一个参数,右侧的对象是第二个参数。在它被声明为成员函数的情况下,就像在本例中一样,左边的对象是调用对象,右边的对象是参数。

如果它被声明为自由函数,它会是什么样子:

operator<<(std::cout, "Hello World");

但是,无论它是被声明为成员还是自由函数,您仍然可以使用相同的替代调用语法。

<<是左移位运算符,>>是右移位运算符,就像它们在Java和C#中一样。

然而,此外<<被过载,以提供一种向流输出值的方式。流std::cout通常指的是程序启动的终端,用<<向该流写入一些内容将其写入终端。类似地,>>被过载以从流中读取,并且在从终端读取流std::cin的情况下,程序在上启动

这类事情在C++中有效,因为您为用户定义的类型定义了运算符的行为。在java中,运算符只对内置类型进行操作——如果ab是您自己类的实例,则写入a + b是错误的。在C++中,如果类定义了一个合适的运算符+,则允许这样做。

在I/O流的情况下,<<>>运算符被重载以表示除位移位之外的其他内容。例如,std::ostream::operator<lt;对于许多类型都是重载的,您也可以为自己的类型添加重载。例如:

#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++有流
<lt;是一个运算符,它是一个用于将数据"附加到流中"的运算符
And>>用于从流中提取数据
当然,您可以用不仅仅是流的类来实现这一点

通常,<<>>运算符具有相同的含义。然而,在您给定的情况下,它们分别是流写入和读取运算符。具体来说,<<是写运算符(可以认为它指向流),>>是读运算符(指向远离流)。

它们是通过重载<<>>运算符来处理的。特别地,C++范式是分别为ostreams和istreams添加<<>>的重载,以处理输入和输出。C++没有像Java和C#那样内置ToString()的范例

最后,std::coutstd::cinstd::cerr分别是ostreamistreamostream的实例,这就是它们获得<<>>过载的原因。

例如,以下代码将Hello World输出到标准输出流。

std::cout << "Hello World" << std::endl;

最后,std::endl是一个特殊的ostream,它添加了一个换行符并刷新流。

在C和C++中,<lt;操作员的意思是"左移"。在C++中,当使用标准模板库时,<lt;和>>运算符被重载以实现流式API。

对象std::cout确实重载了<lt;运算符将其用作转换函数(在本例中为打印到控制台的字符串)。

实际上这个:

int x = myFunction();
std::cout << x;

这个:

std::cout << myFunction();

在功能上是相同的(除了临时变量x的定义之外)。