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

大家请看下面的代码,请问 输出结果是??

/**
 * @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 中的元素必须得拥有复制构造函数。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值