先看下面一段代码,试着分析一下在程序的运行过程,何时调用构造函数,何时调用析构函数,理清思路后,和程序后面的结果比对一下,看看预想的和实际的结果有什么不同。
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct exmp1
{
//默认构造函数
exmp1()
{
cout<<"exmp1()"<<endl;
}
//复制构造函数
exmp1(const exmp1&)
{
cout<<"exmp1(const exmp1&)"<<endl;
}
//赋值操作符
exmp1& operator=(const exmp1&other)
{
cout<<"operator=(const exmp1&)"<<endl;
return *this;
}
//析构函数
~exmp1()
{
cout<<"~exmp1()"<<endl;
}
};
void func1(exmp1 obj)
{
}
void func2(exmp1 &obj)
{
}
exmp1 func3()
{
exmp1 obj;
return obj;//返回exmp1对象
}
int _tmain(int argc, _TCHAR* argv[])
{
exmp1 eobj;//调用exmp1的默认构造函数创建exmp1 的对象 eobj
func1(eobj);//调用复制构造函数,将形参exmp1对象作为实参exmp1对象的副本。函数执行完毕后
//将调用exmp1的析构函数,来撤销形参exmp1对象
func2(eobj);//形参为exmp1对象的引用,无须调用复制构造函数传递实参
eobj=func3();//调用默认构造函数创建局部exmp1对象,函数返回时调用复制构造函数创建
//作为返回值副本的exmp1对象,然后调用析构函数撤销局部exmp1对象,然后调用赋值操作符,执行
//完毕后,撤销作为返回值副本的exmp1对象。
exmp1 *p=new exmp1;//调用默认的构造函数创建一个exmp1对象
std::vector<exmp1>evec(3);//调用默认的构造函数,创建一个临时值exmp1对象,
//然后三次调用复制构造函数,将临时值exmp1对象复制到vector容器evec中的每个元素
//然后调用析构函数撤销临时exmp1对象。
delete p;//调用析构函数撤销动态创建的exmp1对象
return 0;//evec 以及eobj的生命周期结束,自动调用析构函数撤销,撤销evec时候,会调用析构函数
//3次,因为evec有3个元素。
}