您的位置:首页 > 编程语言 > C语言/C++

C++ Primer----一个关于 vector 的有趣的问题

2014-03-16 20:21 399 查看
大家请看下面的代码,请问 输出结果是??

/**
* @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 中的元素必须得拥有复制构造函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Primer