什么是<< operator for in C++? [duplicate]

问题描述 投票:0回答:6

我从 C# 和 Java 背景转向 C++,我试图理解

>>
<<
运算符,例如 in

std::cout << "Hello World";

我在这里无法理解的是

<<
运算符的用途。我尝试声明自己的简单函数,它始终返回整数
5
,我可以像在 C# 中那样调用它,

int x = MyFunction();

这会将

x
变成
5
,但为什么我需要将
std::cout
<<
一起使用?另外,如果您能帮助我理解
>>
<<
的用途,我将非常感激。

感谢大家帮助我理解这一点。真正让我大开眼界的是 std::cout 是一个对象:)

c++ function operators
6个回答
9
投票

你没有准确地拼写出来,但我相信你的困惑在于你认为

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");

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


2
投票

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

但是,另外

<<
被重载以提供一种将值输出到流的方法。流
std::cout
通常指的是启动程序的终端,使用
<<
向该流写入内容会将其写入终端。
>>
同样被重载以从流中读取,并且在流
std::cin
从终端读取程序启动的情况下。

这种事情在 C++ 中有效,因为您为用户定义类型定义了运算符的行为。在 java 中,运算符仅对内置类型进行操作 - 如果

a + b
a
是您自己的类的实例,则编写
b
是错误的。在 C++ 中,这是允许的 if 该类定义了合适的运算符
+


2
投票

在 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;
}

1
投票

据我所知,c++ 有流
<< is an operator that is an operator that is used to "append data" to a stream
>> 用于从流中提取数据。
当然,您可以使用不仅仅是流的类来实现这一点。


1
投票

一般来说,

<<
>>
运算符具有相同的含义。但是,在您给出的情况下,它们分别是流写入和读取运算符。具体来说,
<<
是写入操作符(将其视为指向流),
>>
是读取操作符(指向远离流)。

它们是通过重载

<<
>>
运算符来处理的。特别地,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
,它添加换行符并刷新流。


1
投票

在 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 的定义)。

© www.soinside.com 2019 - 2024. All rights reserved.