我的问题是:以下关于STL堆栈的代码是否正确?如何在STL堆栈中保存用户定义的类型?
在代码,配合物是用构造和析构定义的用户定义的类。 放置1后,复杂的构造函数和析构函数分别被调用5次, 和放置2后,由于pop(),复杂的析构函数再次被调用5次。因此在总的析构函数中调用的不仅仅是构造函数。 IMO不应该发生。 我的代码是否正确?如果不正确如何纠正它?假设我仍然使用堆栈,而不是叠加
#include <stack>
#include "complex.h"
using namespace std;
void test_stack(){
stack<complex> mystack2;
cout << "Pushing complex..." << endl;
for (int i=0; i<5; ++i) {
complex c(i,i);
mystack2.push(c);
}
//place 1
cout << "Popping out complex..." << endl;
while (!mystack2.empty())
{
cout << " " << mystack2.top();
mystack2.pop(); //void pop();
}
//place 2
cout << endl;
}
正确。我没有意识到在push(c)中调用拷贝构造函数。注意push的定义:void push(const T&x)。我认为它就像foo(const T&x),其中x是通过引用传递的,所以没有构造新的复合体。但似乎push(const T&x)像复制构造一样工作:complex(const T&x)。 – user389955 2013-05-08 03:13:24
@ user389955:在调用push()时,新的'complex'不是构造的。它被构建在push的内部,因为堆栈保存了你传入的值的拷贝* – nobar 2013-05-08 13:05:58
@nobar:thx我明白了。 – user389955 2013-05-16 21:15:35