流插入运算符重载

时间:2009-10-07 23:43:23

标签: c++

我真的不确定如何调用该函数:

friend ostream& operator<<(ostream& out, stack::myItem& theItem);

对我的堆栈对象公开:

class stack
{
public:
    stack(int capacity);
    ~stack(void);
     void method1();
     ...

private:

    struct myItem
    {
        int             item;
    };

      ...
public:
    friend ostream& operator<<(ostream& out, stack& s);
    friend ostream& operator<<(ostream& out, stack::myItem& theItem);
};

3 个答案:

答案 0 :(得分:3)

与使用流操作符&lt;&lt;无异。对于任何其他类型(由于某种原因,它被称为operator 重载)。

但是,输出不应该修改对象,因此你真的应该通过const引用传递它(否则使用temporaries的调用将无法编译)。

friend ostream& operator<<(ostream& out, const stack& s);
friend ostream& operator<<(ostream& out, const stack::myItem& theItem);

答案 1 :(得分:3)

此运算符是经典的二元运算符。

// Say I have an operator declared like this:
return_type operator@(left_type lhs, right_type rhs);

// Then the invocation is done this way:
left_type L;
right_type R;
return_type result = L @ R;

在流操作符的情况下,它有点特殊,因为左手参数和返回类型实际上具有相同的类型(实际上,将引用相同的对象,尽管在不同的时间)。这样做是为了允许链接。

// Chaining
std::cout << "<Output>  " << 1 << std::endl;

// Which can be analyzed like such
operator<<(
  operator<<(
    operator<<(
      std::cout ,
      "<Output>  "
    ),
    1
  ),
  std::endl
);

如您所见,语法只允许方便的调用。有人可能会注意到订单定义非常明确,这是一个严格的从左到右的评估。

因此,对于您的对象,它将成为:

stack s;
std::cout << s << std::endl;

就像那样!

答案 2 :(得分:1)

从哪里打电话?因为它的编码只有类知道私有结构。类外部的代码都不能使用该方法,因为它无法创建结构的实例。将它标记为朋友对你没有多大好处。