全国计算机等级考试二级:C++对象的拷贝与赋值操作

全国计算机等级考试二级:C++对象的拷贝与赋值操作,第1张

全国计算机等级考试二级:C++对象的拷贝与赋值操作,第2张

我发现有些同事写类的时候知道什么时候实现复制构造函数和赋值操作,但是不知道什么时候调用复制构造函数和赋值操作,甚至混淆。
要理解这个问题,最简单的方法就是写一个测试程序,试一试。然而,这样做可能不是一个好主意。实验的结果往往导致片面的结论。不如好好想想,搞清楚原理,然后写个程序验证一下。

复制构造函数,顾名思义,等于复制+构造。它负责创建一个新对象和复制另一个对象。例如,在下列情况下调用复制构造函数:
CString str = strOther;

赋值操作只意味着复制,这意味着对象必须已经存在。例如,在以下情况下将调用赋值操作。
str = strOther;

但是,有些对象是隐式的,由编译器生成的代码创建,例如当函数通过值传递对象时。因为看不到相关代码,所以不容易理解。但是,我们稍微想一想,就会觉得既然是基于一个已有的对象副本生成一个新的对象,那么调用复制构造函数是很自然的。

两者有什么区别?我想有人会说,没有区别。好吧,如果没有区别,那就实现其中一个吧。为什么两者都需要实现?不要拐弯抹角,它们之间的区别是:

复制构造函数对同一个对象只调用一次,在构造对象时调用。这个时候对象本身还没有构造好,也不需要释放自己的一些资源。赋值操作可能会被多次调用,所以你得在复制之前释放一些自己的资源,否则会造成资源泄露。

理解了这些原则后,我们应该编写一个测试程序来验证我们的想法:

# include
# include
# include

class CString
{
public:
CString();
CString(const char * PSZ buffer);
~ CString();
CString(const CString & other);
const CString & operator =(const CString & other);

private:
char * m _ PSZ buffer;;
};

CString::CString()
{
printf(" CString::CString \ n ");
m _ PSZ buffer = NULL;
退货;
}
CString::CString(const char * PSZ buffer)
{
printf(" CString::CString(const char * PSZ buffer)\ n ");
m_pszBuffer = pszBuffer!= NULL?strdup(PSZ buffer):NULL;
退货;
}

CString::~ CString()
{
printf(" % s \ n ",_ _ func _ _);
删除m _ pszBuffer
m _ PSZ buffer = NULL;
退货;
}

CString::CString(const CString & other)
{
if(this = = & other)
{
return;
}
printf(" CString::CString(const CString & other)\ n ");
m _ PSZ buffer = other . m _ PSZ buffer!= NULL?strdup(other . m _ PSZ buffer):NULL;
}

const CString & CString::operator =(const CString & other)
{
printf(" const CString & CString::operator =(const CString & other)\ n ");
if(this = = & other)
{
return * this;
}
if(m_pszBuffer!= NULL)
{
free(m _ PSZ buffer);
m _ PSZ buffer = NULL;
}
m _ PSZ buffer = other . m _ PSZ buffer!= NULL?strdup(other . m _ PSZ buffer):NULL;
return * this;
}

void test(CString str)
{
CString str 1 = str;
退货;
}

int main(int argc,char * argv[])
{
CString str;
CString str 1 = " test ";
CString str 2 = str 1;
str 1 = str;
CString str 3 = str 3;
测试(str);
返回0;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 全国计算机等级考试二级:C++对象的拷贝与赋值操作

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情