拷贝构造函数和赋值运算符
class CExample
{
...
};
int main(int argc, char* argv[])
{
CExample theObjone;
theObjone.Init40);
CExample theObjtwo=theObjone;
CExample theObjthree;
theObjthree=theObjone;
return 0;
}
第一、“CExample theObjtwo=theObjone”语句中的 “=”,表示的是对象的初始化,其调用的是拷贝构造函数。如果在类定义中没有定义拷贝构造函数而类中包含指向其它资源的指针,则两个对象中的资源指针讲指向相同的地方,即所指资源由两个对象公用了,这不符合两个对象之间的独立约束,为空间的删除到来隐患。因此由必要通过引用拷贝构造函数来解决这个问题;
第二、“theObjthree=theObjone”语句中的“=”表示赋值操作,将theObjone的内容复制倒theObjthree,这涉及到theObjthree中原有内容的丢弃,新内容的复制。但"="的缺省操作只是将成员变量的值进行相应复制,如果在类中包含指向其它资源的指针,同样会涉及到上面的问题,因此应该考虑重载"="赋值操作符号;
第三、拷贝构造函数除了对象的初始化外还有两种场合会调用:当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调同拷贝构造函数;当函数中的局部对象被被返回给函数调者时,也将建立此局部对象的一个临时拷贝,拷贝构造函数也将被调用。
因此对拷贝构造函数和赋值运算符一定要认真理解,才能避免错误发生。
阅读(968) | 评论(0) | 转发(0) |