C++中构造函数与析构函数的使用(2)
发布时间:2021-06-06
发布时间:2021-06-06
$%&’’()*+,-.
/01%+$2
()*+,-3$4,’)$5&*"’)*67899:;&普通构造函数()*+,-3$4,’)()*+,-<4)5=*:;&拷贝构造函数!()*+,-3>4+?:;&析构函数
()*+,-<4/=*&)=63$4,’)()*+,-<4)5=*:;&赋值函数/*+>&)=2
$5&*"@?&)&;&用于保存字符串
A;
&()*+,-的普通构造函数()*+,-22()*+,-3$4,’)$5&*"’)*:.+B3’)*’
7899:.@
?&)&6,=C$5&*D!E;
"
@?&)&6‘’
;A=%’=.
+,)%=,-)56’)*%=,3’)*:;
@?&)&6,=C$5&*D%=,-)5F!E;’)*$/G3@?&)&H’)*:;
AA
&()*+,-的析构函数()*+,-22!()*+,-3>4+?:.?=%=)=DE@?&)&;A
()*+,-22()*+,-3$4,’)()*+,-<4)5=*:.
&允许操作4)5=*的私有成员@?&)&+,)%=,-)56’)*%=,34)5=*I@?&)&:;@?&)&6,=C$5&*D%=,-)5F!E;’)*$/G3@?&)&H4)5=*I@
?&)&:;
A
&赋值函数
()*+,-<()*+,-224/=*&)=63$4,’)()*+,-<4)5=*:.
&3!:检查自赋值+B3)5+’66<4)5=*:*=)0*,")5+’;
&3J:释放原有的内存资源!"#
?=%=)=DE@?&)&;
&3K:分配新的内存资源,并复制内容+,)%=,-)56’)*%=,34)5=*I@?&)&:;
@?&)&6,=C$5&*D%=,-)5F!E;’)*$/G3@?&)&H4)5=*I@?&)&:;&3L:返回本对象的引用*=)0*,")5+’;A
在本例中类()*+,-拷贝构造函数与普通构造函数的区别是:在函数入口处无需与7899进行比较,这是因为“引用”不可能是7899,而“指针”可以为7899。类()*+,-的赋值函数比构造函数复杂得多,分四步实现:
3!:第一步,检查自赋值。你可能会认为多此一举,难道有人会愚蠢到写出&6&这样的自赋值语句M的确不会。但是间接的自赋值仍有可能出现,例如&内容自赋值16&;…$61;…
&6$;
&地址自赋值16<&;…
&6"1;
也许有人会说:“即使出现自赋值,我也可以不理睬,大不了花点时间让对象复制自己而已,反正不会出
错M”他真的说错了。看看第二步的?=%=)=,自杀后还能复制自己吗N所以,如果发现自赋值,应该马上终止函数。注意不要将检查自赋值的+B语句+B3)5+’66<4)5=*:错写成为:
+B3")5+’664)5=*:3J:第二步,用?=%=)=释放原有的内存资源。如果现在不释放,以后就没机会了,将造成内存泄露。3K:第三步,分配新的内存资源,并复制字符串。注意函数’)*%=,返回的是有效字符串长度,不包含结束符‘’。函数’)*$/G则连‘’一起复制。3L:第四步,返回本对象的引用,目的是为了实现&616$这样的链式表达。注意不要将*=)0*,")5+’错写成*=)0*,)5+’。那么能否写成*=)0*,4)5=*呢N结果是不是一样呢N不可以M结果可能完全不同,因为我们不知道参数4)5=*的生命期。有可能4)5=*3下转!KK页:
"
下一篇:火灾漏电报警系统设计方案