所谓构造函数,顾名思义,就是构造一个对象(当然这要根据构造函数的具体内容包括参数来构造),在上面的代码中,A Obj1; //没有明确指明构造函数,便调用默认构造
//han数,一种情况是无参的构造函数,另种情况便是参数都有缺省值的构造函数下面的也类似,参数匹配问题
A Obj2(2,3); //invoke A(int,int),
而拷贝构造函数,是为了根据一个已经存在的对象来构造另一个对象,而赋值号=也有类似的功能。但被调用的情况不一样。通常情况下,在我们不明写拷贝构造函数和不重载=时候,使用时候都会调用默认的。但是,这种情况下,无论是拷贝构造还是=都是按成员赋值。这样,若成员变量中有指针,拷贝构造后两个对象便会操作同块内存,往往出错。所以我们通常会重写拷贝构造函数和重载=.为指针变量开辟新的空间。
例如
class A
{
public:
char* p;
}
如果我们不重写拷贝构造函数,这样用
A a;
A b(a);//这里会调用默认的拷贝构造函数,按成员赋值,会有b.p = a.p;这样a和b会共用p指向的地址。
所以我们重写拷贝构造
A(A&ra)
{
p = new char;//在析构函数中delete
strcpy(ra.p,p);
}
=和拷贝构造的结果应该是一样的,可被调用的情况不同
如 A A1;//调用默认构造,上面说过
A A2(A1);//调用拷贝构造
A A3 = A1;//调用重载的=
A A4;//调用默认构造
A4(A1);//注意,这里会调用=而不是拷贝构造函数。
//han数,一种情况是无参的构造函数,另种情况便是参数都有缺省值的构造函数下面的也类似,参数匹配问题
A Obj2(2,3); //invoke A(int,int),
而拷贝构造函数,是为了根据一个已经存在的对象来构造另一个对象,而赋值号=也有类似的功能。但被调用的情况不一样。通常情况下,在我们不明写拷贝构造函数和不重载=时候,使用时候都会调用默认的。但是,这种情况下,无论是拷贝构造还是=都是按成员赋值。这样,若成员变量中有指针,拷贝构造后两个对象便会操作同块内存,往往出错。所以我们通常会重写拷贝构造函数和重载=.为指针变量开辟新的空间。
例如
class A
{
public:
char* p;
}
如果我们不重写拷贝构造函数,这样用
A a;
A b(a);//这里会调用默认的拷贝构造函数,按成员赋值,会有b.p = a.p;这样a和b会共用p指向的地址。
所以我们重写拷贝构造
A(A&ra)
{
p = new char;//在析构函数中delete
strcpy(ra.p,p);
}
=和拷贝构造的结果应该是一样的,可被调用的情况不同
如 A A1;//调用默认构造,上面说过
A A2(A1);//调用拷贝构造
A A3 = A1;//调用重载的=
A A4;//调用默认构造
A4(A1);//注意,这里会调用=而不是拷贝构造函数。
要么死去,要么奋斗!