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 中的元素必须得拥有复制构造函数。
C++ Primer----一个关于 vector 的有趣的问题的更多相关文章
- C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器
vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...
- C++中一个函数隐藏的有趣例子
函数隐藏是一个函数的定义或声明导致其他一些函数不可见. 函数A隐藏函数B的条件: 1. 两个函数具有相同的函数名称 2. 具有不同的作用域.所谓定义域函数定义或声明的位置,如全局作 ...
- 发现一个c++ vector sort的bug
在开发中遇到一个非常诡异的问题:我用vector存储了一组数据,然后调用sort方法,利用自定义的排序函数进行排序,但是一直都会段错误,在排序函数中打印参加排序的值,发现有空值,而且每次都跟同一个数据 ...
- [转载]Vector用法(C++ Primer中文版)
转自:http://blog.sciencenet.cn/blog-261330-551086.html vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对 ...
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- C++ Primer 有感(标准库vector及迭代器)
vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...
- Cocos2d-x3.0模版容器之中的一个:cocos2d::Vector<T>
版本号:v3.0 beta以后 语言:C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCVector.h" 的头文件里. t ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- C++Primer 5th 练习 12.19
这阵子真是太忙了, 连续做了四个课设. 当然这并不能作为好久没写博客的借口, 没写博客的主要原因只有一个: 懒. 最近又开始回顾C++的语法与特性(据说C++就是一门需要反复回顾的语言),以及学习C+ ...
随机推荐
- HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- MySQL忘记密码怎么办
1. 关闭正在运行的MySQL服务2. 打开DOS窗口,转到mysql\bin目录3. 输入mysqld --skip-grant-tables 回车 --skip-grant-table ...
- ABAP-smartform-一页3列的条码打印
1.自建barcode: se73->System bar code->change->create->new input the name of the bar code y ...
- 5月23日 JavaScript练习:累加求和
第一种方法: 第二种方法:
- CPU厂商
1·Intel公司 Intel是生产CPU的老大哥,它占有大约80%的市场份额,Intel生产的CPU就成了事实上的x86CPU技术规范和标准.最新的酷睿2成为CPU的首选. 2·AMD公司 除了In ...
- [转]C#取得内网IP、外网IP、客户端IP方法
前言 在 Windows Form Application 里对于取得 IP Address 有内网.外网两种 IP Address ,如果只需要取得内网 IP Address ,可以透过使用 IPH ...
- jQuery.Autocomplete实现自动完成功能(详解)
1.jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ http://do ...
- POJ 1094 拓扑排序
Description: 规定对于一个只有大写字母的字符串是有大小顺序的.如ABCD.即A<B.B<C.C<D.那么问题来了.现在第一行给你n, m代表序列里只会出现前n的 ...
- 如何在Hadoop的MapReduce程序中处理JSON文件
简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...
- CAP Confusion: Problems with ‘partition tolerance’
by Henry Robinson, April 26, 2010 The 'CAP' theorem is a hot topic in the design of distributed data ...