拷贝构造的调用时机

来源:互联网 发布:java 闰年 编辑:程序博客网 时间:2024/05/19 20:38

class person
{
private:
char *name;
public:
person()//无参构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, "no parameter");
//std::cout << "malloc for name" << std::endl;
std::cout << "无参构造"<< std::endl;
}
person(const char* p)//有参构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, p);
//std::cout << p<< std::endl;
std::cout << "有参构造" << std::endl;
}
person(const person& per)//拷贝构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, per.name);
std::cout << "拷贝构造" << std::endl;
}
~person()
{
if (this->name != NULL)
{
free(name);
name = NULL;
}
std::cout << "析构" << std::endl;
}
};

1.旧对象初始化新对象

void test0()//用旧对象初始化新对象时,会调用拷贝构造
{
person per0;
person per1 = person(per0);//旧对象初始化新对象
}

2.函数的形参是普通对象

void test1(person per)//函数参数时普通对象,在调用函数时,会调用拷贝构造
{
//函数参数时普通对象
}

3.函数返回的是普通对象

person test3()
{
person per;
return per;//返回局部对象,会调用拷贝构造
}
int main()
{
person per1 = test3();
system("pause");
return 0;
}

对于返回普通对象的函数来说,按照常理来看,程序会将执行test3(),因为该函数返回一个对象,所以,函数会执行一次拷贝构造。当在main函数中,执行per1=“test3()返回的对象时”,应该还会再执行一次拷贝构造。但是,运行程序,发现程序只执行了一次拷贝构造。这是因为,编译器存在一种返回值优化技术。一个对象的拷贝和析构是非常耗时的,为了在效率上进行优化,上面的一段代码,实际上被编译器优化为:

person test3(person& per)

{

//相关操作

return;

}

person per1;

test3(per1);

0 0