**************************************************************************************************************
问题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();以值传递的方式传出返回值,与传形参情形原理是一样的。