为什么运营商>> (或<<<重载函数)需要接收i \ ostream引用吗?

时间:2013-04-14 19:47:41

标签: c++ overloading operator-keyword

从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对象已经存在。

3 个答案:

答案 0 :(得分:2)

operator<<通常被定义为自由函数;也就是说,不是会员功能。因为它是一个重载的二元运算符,这意味着它首先得到它的左参数,然后是它的右参数。

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

为了使读者明白,我倾向于使用operatorlhs缩写定义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. Operators in C and C++ - 您可以重载的所有运算符及其典型参数的精彩摘要。

答案 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&)