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 中的元素必须得拥有复制构造函数。
/**
* @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 的有趣的问题
- 今天遇到一个关于对象和对象方法内存分配的有趣的问题
- 【数据结构】一个关于用快慢指针处理循环链表的有趣小问题
- 一个关于.Net的SaveFileDialog控件(Winform)的有趣问题
- 关于asp.net 1.0升级到asp.net 2.0时发现的一个有趣的问题
- 一个有趣的问题:关于Java中的Integer
- 一个关于list的有趣的问题
- JVM 关于垃圾回收一个有趣的问题
- 一个关于Java数据类型的有趣问题
- 关于C语言标输入流的一个有趣的小问题
- 关于打印一个有趣的数字图形的问题
- 关于CacheLookup一个有趣的问题
- 关于IF判断的问题(一个有趣的事情)(分支-08. 高速公路超速处罚(15))
- C++编程一个有趣的问题,关于基类地址与派生类地址
- 关于vxworks看门狗触发函数的优先级的一个有趣问题
- (转载)一个有趣的问题:关于Java中的Integer
- 一个很有趣的关于线程锁的问题
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- 关于php析构函数的一个有趣问题
- 关于局部函数返回值的一个有趣问题