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

时间:2012-10-07 19:25:59

标签: c++ function operators

我来自C#和Java背景到C ++,我试图了解>>&amp; <<运营商,例如

std::cout << "Hello World";

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

int x = MyFunction();

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

感谢大家帮助我理解这一点。真正打开我的想法是std :: cout是和object:)

6 个答案:

答案 0 :(得分:9)

你没有完全拼写出来,但我相信你的困惑是你认为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");

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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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

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

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

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

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

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

答案 3 :(得分:1)

据我记忆,c ++有流 &LT;&LT;是一个运营商,是一个运营商,用于“附加数据”#34;到一个流
并且&gt;&gt;用于从流中提取数据。
当然,您可以使用不仅仅是流的类来实现它。

答案 4 :(得分:1)

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

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

这种事情在C ++中起作用,因为您为用户定义的类型定义了运算符的行为。在java中,运算符仅在内置类型上运行 - 如果a + ba是您自己类的实例,则编写b会出错。在C ++中,如果类定义了合适的运算符+,则允许

答案 5 :(得分:1)

在C和C ++中&lt;&lt;运算符意味着“向左移”。在C ++中,当使用标准模板库时,&lt;&lt;和&gt;&gt;运算符被重载以实现流API。

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

实际上这是:

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

和此:

std::cout << myFunction();

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