2

从 cplusplus.com,我看到ostream该类的成员函数operator<<如下所示:

ostream& operator<< (bool val);   ostream& operator<< (int val);   

.... 等等。

这确实有意义,因为当您像 cout<<x 激活ostream& operator<< (int val) 函数一样使用 Cout 对象时,您实际上是<<在 Cout 对象上使用运算符。这与所有其他运算符非常相似,并将int变量发送到函数。当我想流式传输自己的对象时,有什么区别以及究竟会发生什么?为什么语法是突然的ostream& operator<< (**ostream &os**, object ob)?为什么我需要添加 ostreamvar?我还在用 cout<<ob,这不就是 ostream& operator<< (object obj)为什么吗?我通过的只是我的对象。对象已经在cout那里了。

4

3 回答 3

2

operator<<一般定义为自由函数;也就是说,不是成员函数。由于它是一个重载的二元运算符,这意味着它首先获取其左参数,然后获取其右参数。

传统上返回对其左参数的operator<<引用以启用惯用的输出链。

为了让读者明白,我倾向于使用和缩写来定义我的operator重载;对于某些类型, an看起来与此类似。lhsrhsoperator<<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. C 和 C++中的运算符 - 您可以重载的所有运算符及其典型参数的一个很好的总结。
于 2013-04-14T19:49:40.583 回答
1

为什么我需要添加 ostream var?

我确定它在那里,以便您可以将输出链接在一起:

cout << foo << bar

第一次调用cout << foo将产生一个ostream可用于该<< bar部件的引用。

于 2013-04-14T19:51:10.490 回答
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&)
于 2013-04-14T19:58:47.823 回答