插入运算符 (operator<<) 的这种递归重载是如何工作的?
How does this recursive overload of the insertion operator (operator<<) work?
我正在学习递归。下面是 class 的插入运算符的递归重载,它提供了一个整数链表。它编译并运行,但我不明白为什么。
当重载插入运算符时,我了解到您通常 return 一个 ostream
引用以便可以链接调用。但是,此函数的计算结果不会类似于 out << node
、out << out << node
、out << 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;
}
我正在学习递归。下面是 class 的插入运算符的递归重载,它提供了一个整数链表。它编译并运行,但我不明白为什么。
当重载插入运算符时,我了解到您通常 return 一个 ostream
引用以便可以链接调用。但是,此函数的计算结果不会类似于 out << node
、out << out << node
、out << 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;
}