#include "stdafx.h"
#include <iostream>
using namespace std;
class Internet;
Internet * pa;
Internet * pb;
class Internet
{
public:
Internet()
{
cout<<"默认构造函数"<<endl;
}
Internet(char *name,char *address)
{
cout<<"含参构造函数"<<endl;
strcpy(Internet::name,name);
}
Internet(Internet &temp)
{
cout<<"COPY构造函数";
strcpy(Internet::name,temp.name);
}
~Internet()
{
if(this == pa)
cout<<"a对象析构函数!";
else if (this == pb)
{
cout<<"b对象析构函数!";
}
else
cout<<"临时对象tmp析构函数!";
}
protected:
char name[20];
char address[20];
};
Internet tp()
{
Internet b("中国软件开发实验室","www.cndev-lab.com");
pb = &b;
return b;
}
/*
上面的函数和下面的代码等价,会产生一个临时tmp对象,编译器生成的临时引用对象不会调用构造函数
void tp(Internet & tmp)
{
Internet b("中国软件开发实验室","www.cndev-lab.com"); //调用构造函数
pb = &b;
tmp.Internet::Internet(b);//这里将调用拷贝构造函数
return;//析构b,析构tmp
}
*/
void main()
{
Internet a;
pa = &a;
a=tp(); //等价于tp(a);
}
以上将会调用三次析构函数,也有三次构造函数的调用,其中一个为创建a的时候调用默认构造函数,第二个为创建b的时候调用含参数的构造函数,最后一个为tmp的拷贝构造函数(注意在引用参数传递并不调用拷贝构造参数,这也就是为什么我们习惯在对象比较大的时候优先考虑引用参数传递形式,因为不会发生整个对象的拷贝过程),根据程序注释,你能知道具体的构造和析构过程。
关于引用传递不进行拷贝构造函数,我们可以通过以下的修改来进行相应的验证。
程序改为下面的形式:
void tp(Internet & tmp)
{
Internet b("中国软件开发实验室","www.cndev-lab.com"); //调用构造函数
pb = &b;
return;//析构b
}
void main()
{
Internet a;
pa = &a;
tp(a);
}
结果为通过引用进行参数传递并不会进行构造和析构的过程。
但是如果是通过对象传递(非引用),即如下形式:
void tp(Internet tmp)
{
Internet b("中国软件开发实验室","www.cndev-lab.com"); //调用构造函数
pb = &b;
return;//析构b
}
void main()
{
Internet a;
pa = &a;
tp(a);
}
则会对tmp对象进行拷贝构造和相应的析构。