大家请看下面的代码,请问 输出结果是??
/**
* @file vector-destroy.cc
* @brief an interesting problem regarding vector
* @author shoulinjun@126.com
* @version 0.1.00
* @date 2014-03-16
*/ #include <iostream>
#include <vector>
using namespace std; class MyClass
{
public:
MyClass(int x=0)
: val(x) {} ~MyClass() {
cout << val << " ";
}
void set_val(int x){
val = x;
}
private:
int val;
}; int main(void)
{
vector<MyClass> vec(5); for(vector<MyClass>::size_type i=0; i!=vec.size(); ++i)
vec[i].set_val(i); return 0;
}
我定义了一个 MyClass 的类,这个类的析构函数中,会输出类的成员变量 val 的值。
在 main 函数中,我定义了一个5个元素的 vector,并把这些类的 val 依次设置为 0 1 2 3 4
然而结果是
从结果可以发现两点有意思的:
1. vector 的析构函数调用时, 按照顺序依次调用 vector中的对象的析构函数
2. 为什么会出现两个 0 呢???
不是仅仅定义了 5 个 Myclass 的对象吗??为什么析构函数调用了 6 次??
通过对 STL 源码的分析,终于明白为什么了。。
vector 的构造函数如下:
explicit vector(size_type n) {
fill_initialize(n, T());
}
T() 建立了一个临时对象, fill_initialize() 调用 T 的复制构造函数初始化所有的数组元素。
这个临时对象就是导致我们的结果出现两个 0 的罪魁祸首。
再简要地提几点:
1. C++ 一定会合成一个默认的类的复制构造函数, 无论你是否定义了一个复制构造函数
2. vector 中的元素必须得拥有复制构造函数。