我正在阅读以下问题的河内塔问题。第一个答案说使用
stack<int>&
我的问题是为什么会这样?记忆中发生了什么?
stack
我们正在传递一个引用,这样就不会生成对象的副本。如果进行了复制,则对其进行修改不会影响stack
传递给函数的原始对象。它只会影响函数本地的副本。
引用就像一个对象的别名;当声明为
stack<int>& source
source
现在指的是那个对象。
上述问题中使用的函数具有以下原型:
void Hanoi(int nDisks, stack<int> source, stack<int> intermed, stack<int> dest)
即它stack<int>
按值获取所有传递的对象。创建了传递的副本,stack
并且在此函数的主体内对此对象所做的任何更改都会更改副本,而不是已传递给它的原始对象。
这就是为什么解决方案是stack
通过引用而不是通过值传递这些对象。基本上引用(例如stack<int>& dest
)允许您在函数dest
内部处理Hanoi
它的类型stack<int>
,只是没有复制并且调用者可以看到更改:)