从cplusplus.com,我看到ostream
类的成员函数operator<<
如下所示:
ostream& operator<< (bool val); ostream& operator<< (int val);
....等等。
它确实有意义,因为当您使用像cout<<x
这样的Cout对象时激活ostream& operator<< (int val)
函数,因此您实际上在Cout对象上使用<<
运算符。这与其他所有运算符非常相似,并将int
变量发送给函数。当我想要流式传输自己的对象时,有什么区别以及究竟会发生什么?为什么语法突然ostream& operator<< (**ostream &os**, object ob)
?
为什么我需要添加ostream
var?我仍在使用cout<<ob
所以它不仅仅是ostream& operator<< (object obj)
吗?我通过的只是我的目标。 cout
对象已经存在。
答案 0 :(得分:2)
operator<<
通常被定义为自由函数;也就是说,不是会员功能。因为它是一个重载的二元运算符,这意味着它首先得到它的左参数,然后是它的右参数。
operator<<
传统上返回对其左参数的引用,以启用惯用的输出链。
为了使读者明白,我倾向于使用operator
和lhs
缩写定义rhs
重载;对于某种类型operator<<
,T
看起来与此类似。
std::ostream& operator<<(std::ostream& lhs, T const& rhs)
{
// TODO: Do something
return lhs;
}
与其他二进制文件一样,它可以定义为成员函数。也就是说,让我们假设您定义了自己的iostream
。除此之外,您的类声明可能如下所示。同样,T
是一种特殊类型。
class MyIOStream : public iostream
{
public:
MyIOStream& operator<<(T const& rhs);
}
在这种情况下,operator<<
是一个成员函数。当用作<<
时,它具有相同的语义。
答案 1 :(得分:1)
为什么我需要添加ostream var?
我确信它存在,所以你可以将输出链接在一起:
cout << foo << bar
第一个电话cout << foo
将产生ostream
引用,可用于<< bar
部分。
答案 2 :(得分:1)
某些流提取器是basic_istream
的成员;因为它们是成员,所以隐含basic_istream
参数。某些流提取器不是basic_istream
的成员。因为它们不是成员,所以basic_istream
参数必须是声明的一部分。
像这样(过度简化):
class basic_istream {
public:
basic_istream& operator>>(int& i);
}
basic_istream& operator>>(basic_istream&, std::string& str);
两者都可以用同样的方式调用:
int i;
std::cin >> i; // calls basic_istream::operator>>(int&)
std::string str;
std::cin >> str; // calls operator>>(basic_istrea&, std::string&)