【发布时间】:2015-10-07 01:21:55
【问题描述】:
我正在尝试理解类的向量。首先是班级:
class A {
public:
A() { cout << "A ctor" << endl; }
~A() { cout << "A dtor" << endl; }
};
然后是代码:
int main() {
vector<A> v;
cout << "after vector created" << endl;
v.push_back(A());
cout << "after one A added" << endl;
}
如果我运行程序,输出是:
after vector created
A ctor
A dtor <<-- why this??
after one A added
A dtor
我不明白,额外的析构函数调用是什么。构造函数和析构函数调用不应该成对吗?
其次,如果我将向量按值传递给函数,为什么不调用构造函数?
void f(vector<A> v);
我检查了f 有A 的副本,因为如果我修改它的内部状态,它不会在原始向量中被修改,&v[0] 在f 中返回不同的值。
【问题讨论】:
-
那是因为 vector
::push_back 总是复制你刚刚传入的参数,但是通过复制构造函数。 werid析构函数由temporaray A对象调用,也就是你传入的那个。另外,如果你想直接在vector中创建一个元素,你可以使用emplace_back,C++11支持。 -
正如你上面所说的,是你传入的对象。当对象超出范围时调用析构函数。您传入的 A() 对于 push_back 函数是本地的。一旦超出范围,它的析构函数就会被调用。
-
我有一个可能感兴趣的相关问题:stackoverflow.com/questions/28716209/…
-
感谢所有答案,我选择了提到 C++11 的那一个。