插入运算符 (operator<<) 的这种递归重载是如何工作的?

How does this recursive overload of the insertion operator (operator<<) work?

我正在学习递归。下面是 class 的插入运算符的递归重载,它提供了一个整数链表。它编译并运行,但我不明白为什么。

当重载插入运算符时,我了解到您通常 return 一个 ostream 引用以便可以链接调用。但是,此函数的计算结果不会类似于 out << nodeout << out << nodeout << out << out << node 等吗?在达到基本情况并开始 return 后,您似乎会尝试将 ostream 插入 ostream,这应该会导致错误,不是吗?

ostream & operator<<(ostream &out, const IntList &intList) { 
   if (intList.head != nullptr) out << intList.head;
   return out;
}

ostream & operator<<(ostream &out, IntNode *node) { 
   if (node->next == nullptr) {
      out << node->value;
      return out;
   }
   else { 
      out << node->value << ' ';
      node = node->next;
      return out << node;
   }
}

it seems that you would be trying to insert an ostream into an ostream

没有。您的 << 运算符 return 是 ostream,但这并不意味着您要将其插入另一个 ostream。

在递归函数中执行的每一步,都会在 ostream 和 return 相同的 ostream 中插入一些内容。参见:

out << node->value;
...
out << node->value << ' ';

你总是在 ostream 中插入一些值。

这个return out << node;意味着你将把node->value插入ostream,然后转到下一个节点(如果有下一个节点)。

为了更好地理解,这里是迭代方法,它应该与递归方法完全一样:

ostream & operator<<(ostream &out, const IntList &intList) { 
    IntNode *node = intList.head;
    
    while(node->next != nullptr){
        out << node->value << ' ';
        node = node->next;
    }
    out << node->value;
    return out;
}