2

我来自 C# 和 Java 背景进入 C++,我试图了解>>&<<运算符,例如

std::cout << "Hello World";

我在这里无法理解的是<<操作员的用途。我尝试声明我自己的简单函数,它总是返回整数5,我可以像在 C# 中那样调用它,

int x = MyFunction();

这变成x5,但为什么我需要使用std::coutwith <<?另外,如果您帮助我了解两者的用途,我将不胜>>感激<<

感谢大家帮助我理解这一点。实际上让我想到的是 std::cout 是和对象的事实:)

4

6 回答 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");

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

于 2012-10-07T19:31:12.943 回答
2

在 I/O 流的情况下,<<and>>运算符被重载以表示位移以外的东西。例如,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;
}
于 2012-10-07T19:29:17.710 回答
2

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

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

这种事情在 C++ 中有效,因为您为用户定义的类型定义了运算符的行为。在 Java 中,运算符仅对内置类型进行操作 -如果并且是您自己的类的实例,则编写a + b是错误的。在 C++ 中,如果类定义了合适的 operator ,这是允许的。ab+

于 2012-10-07T19:31:04.210 回答
1

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

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

最后,std::coutstd::cin分别是和std::cerr的实例ostream,这就是它们获得和重载的原因。istreamostream<<>>

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

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

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

于 2012-10-07T19:28:37.650 回答
1

据我记得,c++ 有流
<< 是一个运算符,它是一个用于将数据“附加”到流的运算符,
而 >> 用于从流中提取数据。
当然,您可以使用不仅仅是流的类来实现这一点。

于 2012-10-07T19:29:24.867 回答
1

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

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

其实这个:

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

还有这个:

std::cout << myFunction();

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

于 2012-10-07T19:34:22.530 回答