关于拷贝构造函数和赋值运算符
作者:wuhran
2006-12-16
拷贝构造函数
当我们通过复制一个对象来初始化一个对象的时候,拷贝构造函数都被执行。
对于类中普通的成员变量,如,int, double, char, c++提供默认的拷贝构造函数,我们可以不用写拷贝构造函数就可以了。
如果类中成员有如,CArray,*指针(深拷贝,浅拷贝问题),那么我们就需要写自己的拷贝构造函数。同时注意深拷贝,浅拷贝。
如例子:
class Sample
{
public:
Sample();
~Sample();
public:
int nId;
double dHeight;
};
typedef CArray<Sample, Sample> SampleArray;
在函数中调用如:
void TestSample()
{
Sample sample;
sample.nId = 0;
sample.dHeight = 0.0;
SampleArray sampleArr;
sampleArr.Add(sample);
}
OK,这样是正确的。对于基本的数据类型,C++提供了默认的拷贝构造函数。
如果是这样,我们把Sample类修改一下;
class Sample
{
public:
Sample();
~Sample();
public:
CStringArray strArr;
int nId;
};
typedef CArray<Sample, Sample> SampleArray;
同样的方法用TestSample函数调用,编译就会出错,提示没有拷贝构造函数。因为CStringArray没有被提供默认的拷贝构造函数。
下面是正确的写法:
class Sample
{
public:
Sample();
~Sample();
Sample(const Sample& src)
{
strArr.Copy(src.strArr);
nId = src.nId;
}
public:
CStringArray strArr;
int nId;
};
ok,编译通过,使用正常。
还有一个就是深拷贝,浅拷贝的问题,很多文章讨论过,不多说了。
赋值操作符
别的不多说,说说写法。
class Sample
{
public:
Sample();
~Sample();
Sample(const Sample& src)
{
strArr.Copy(src.strArr);
nId = src.nId;
}
Sample& operate = (const Sample& src)
{
if(this == &src)
{
return *this;
}
strArr.Copy(src.strArr);
nId = src.nId;
return *this;
}
public:
CStringArray strArr;
int nId;
};