拷贝构造函数

时间:2022-03-09 15:55:27

**************************************************************************************************************

问题1:什么时候拷贝构造函数会被调用?

(1)一个对象以值传递的方式传入函数体,例如:

(2)一个对象以值传递的方式从函数返回

(3)一个对象需要通过另一个对象进行初始化

举例说明这三种情况:

class PERSON
{
	int age;
	char* name;
	PERSON(int age_tmp,const char* name_str)
	{
		age = age_tmp;
		name = new char[50];other.name, 50);	
	strcpy(
name ,
name_str
);}};void person_age_add(PERSON pers){pers.age++;}PERSON get_person_age(void){PERSON a = new PERSON(10);return a;}main(){PERSON a(20);PERSON b=(a);PERSON c(a);PERSON d;d = a;person_age_add(a);a = get_person_age();}

上述例子中,b和c声明过程是一样的,用a来初始化和产生对象b、c,在初始化之前,b和c尚没有产生(构造),所以,这时会调用到拷贝构造函数,即情况(3);

变量d是事先声明好的,声明时已经被默认的无参构造函数给构造完成了,所以d=a这一句不会发生拷贝构造函数的调用;

person_age_add(a);这一句是实参的值传递,person_age_add接收到的不是a本身,而是a的副本,在传参过程中会发生形参的构造过程,由于形参per尚未实例化,需要用实参进行初始化进行产生,传参过程相当于执行PERSON pers=a;这一句类似于上面的PERSON b=a;,需要调用拷贝构造函数。

a = get_person_age();以值传递的方式传出返回值,与传形参情形原理是一样的。