关于拷贝构造函数和赋值运算符

关于拷贝构造函数和赋值运算符,第1张

关于拷贝构造函数和赋值运算符,第2张

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的构造函数进行复制。

原则上,应该为所有包含动态分配成员的类提供复制构造函数。

复制构造函数的另一个调用。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 关于拷贝构造函数和赋值运算符

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情