关于拷贝构造函数和赋值运算符
class ce xample
{
public:
ce xample(){ p buffer = NULL;nSize = 0;}
~ ce example(){ delete p buffer;}
void Init(int n){ p buffer = new char[n];nSize = n;}
private:
char * p buffer;//类的对象包含指向动态分配的内存资源的指针
int nSize;
};
该类的主要特征是它包含指向其他资源的指针。
PBuffer指向堆中分配的一段内存空。
一、复制构造函数
int main(int argc,char * argv[])
{
ce example theObjone;
theObjone。init 40);
//现在需要另一个对象,需要初始化成object one的状态
c例子theobjtwo = theobjone
...
}
语句" CExample theObjtwo = theObjone"用Objone初始化obj one。
这是通过内存复制完成的,内存复制会复制所有成员的值。
完成后,theobjtone . p buffer = = theobjone . p buffer。
也就是说,它们会指向同一个地方。虽然指针被复制了,但是它所指向的空并没有被复制,而是被两个对象共享。这样不符合要求,对象不独立,给空之间的删除带来隐患。
因此,应该采取必要的措施来避免这种情况。
回顾一下这个语句的具体过程:首先建立对象theObjtwo并调用其构造函数,然后复制成员。
可以在构造函数中添加操作来解决指针成员的问题。
因此,C++语法不仅提供了默认的构造函数,还规定了另一种特殊的构造函数:复制构造函数。在上面的语句中,如果复制构造函数是在类中定义的,那么当对象建立后,复制构造函数就会被调用。在复制构造函数中,指针指向的资源可以根据传入变量进行复制。
复制构造函数的格式为:构造函数名称(对象的引用)
提供复制构造函数后的CExample类定义为:
class ce xample
{
public:
ce xample(){ p buffer = NULL;nSize = 0;}
~ ce example(){ delete p buffer;}
ce example(const ce example &);//复制构造函数
void init(int n){ p buffer = new char[n];nSize = n;}
private:
char * p buffer;//类的对象包含指向动态分配的内存资源的指针
int nSize;
};
example::example(const example & right sides)//复制构造函数的定义
{
nsize = right sides . nsize;//复制常规成员
p buffer = new char[nSize];//复制指针所指向的内容
memcpy (pbuffer,rightsides.pbuffer,nsize * sizeof(char));
}
这样,当用一个已有的对象定义并初始化一个新的对象时,就会调用ce xample(const ce xample & RightSides),将已有的对象传递给别名为right sides的构造函数进行复制。
原则上,应该为所有包含动态分配成员的类提供复制构造函数。
复制构造函数的另一个调用。
位律师回复
0条评论