我来自C#和Java背景到C ++,我试图了解>>
&amp; <<
运营商,例如
std::cout << "Hello World";
我在这里无法理解的是<<
运算符的用途。我尝试声明我自己的简单函数,它总是返回整数5
,我可以像在C#中那样调用它,
int x = MyFunction();
并将x
变为5
,但为什么我需要将std::cout
与<<
一起使用?如果您帮助我理解>>
和<<
的用途,我将非常感激。
感谢大家帮助我理解这一点。真正打开我的想法是std :: cout是和object:)
答案 0 :(得分: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");
但是,无论是声明为成员还是自由函数,您仍然可以使用相同的替代调用语法。
答案 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 ++范例是分别为<<
和>>
添加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
,它添加换行符并刷新流。
答案 3 :(得分:1)
据我记忆,c ++有流
&LT;&LT;是一个运营商,是一个运营商,用于“附加数据”#34;到一个流
并且&gt;&gt;用于从流中提取数据。
当然,您可以使用不仅仅是流的类来实现它。
答案 4 :(得分:1)
<<
是左移运算符,>>
是右移运算符,就像它们在Java和C#中一样。
但是,另外,<<
被重载以提供向流输出值的方法。流std::cout
通常是指程序启动的终端,并使用<<
向该流写入内容将其写入终端。类似地重载>>
以从流中读取,并且在流std::cin
的情况下从终端读取程序已启动。
这种事情在C ++中起作用,因为您为用户定义的类型定义了运算符的行为。在java中,运算符仅在内置类型上运行 - 如果a + b
和a
是您自己类的实例,则编写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的定义)。