相关背景知识:
构造函数:类的特殊成员函数,当创建类对象的时候,系统自动调用构造函数,用于完成一些初始工作。特点:构造函数名与类名相同、没有返回值,返回void也不行,但可以无值返回、可以不定义构造函数,编译器为类生产一个默认的构造函数,称为合成的默认构造函数,它会初始化类中的成员。构造函数可以带0到多个参数,可以重载;
析构函数:类的特殊成员函数,当销毁对象时,系统自动调用析构函数,一般用于完成清理工作。特点:系统函数名为类名前加~、不能有返回值、不能有参数、不能重载,可以不定义析构函数,编译器为我们生成一个合成的析构函数,它会按照初始化的逆序析构成员对象,但不会销毁指针所指的对象
拷贝构造函数:类的特殊成员函数,它的参数为该类的常量引用型,在对象拷贝时调用拷贝构造函数,对象拷贝不会调用构造函数,但是销毁时却会调用析构函数,所以需要定义拷贝构造函数,否则在有资源申请和释放的类中会出现问题。产生拷贝的情况:对象定义时用另一个对象的值初始化该对象、对象作为函数的参数按值传递、对象作为函数的返回值按值返回。
关于vector内存的分配,参考上一篇文章:STL中vector内存分配策略剖析
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
class CTest
{
public:
CTest(){cout<<"CTest Constructor!"<<endl;}
CTest(const CTest & test){cout<<"CTest Copy Constructor!"<<endl;}
~CTest(){cout<<"~CTest Destructor"<<endl;}
};
int main(int argc,char **argv)
{
vector<CTest> vec;
for(int i = 0;i<10;++i)
{
CTest test;
vec.push_back(test);
cout<<"size="<<vec.size()<<" capacity="<<vec.capacity()<<endl;
}
return 0;
}
实验结果如下:
CTest Constructor!
CTest Copy Constructor!
size=1 capacity=1
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
~CTest Destructor
size=2 capacity=2
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
~CTest Destructor
~CTest Destructor
size=3 capacity=4
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
size=4 capacity=4
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
size=5 capacity=8
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
size=6 capacity=8
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
size=7 capacity=8
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
size=8 capacity=8
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
CTest Copy Constructor!
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
size=9 capacity=16
~CTest Destructor
CTest Constructor!
CTest Copy Constructor!
size=10 capacity=16
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
~CTest Destructor
结果分析:
在每次重新分配内存的时候,要拷贝原先的元素到新的内存空间,并释放原先的空间,所以拷贝构造函数和析构函数在每次分配内存的时候,都会多调用n次,n大小为size。
结果思考:如果传对象的指针是否会消除这样的影响呢?
参加下期:STL中vector元素为自定义对象指针的分析,谢谢观看!