现在的位置: 首页 > 综合 > 正文

关于构造和析构的几点拟人化思考

2012年08月10日 ⁄ 综合 ⁄ 共 1550字 ⁄ 字号 评论关闭

Zephyr

1304

学而不思则罔,思而不学则殆,

最近对EffectiveC++等书的复习,

发现体悟良多,

温故可以知新,古人诚不我欺。

也是,DesignPatternC++底层等,

在没有长期使用和大型系统的经历前,

往日都是小和尚念经,有口无心,

Inside C++Object所言

不要靠猜,不要等大师来解决

想要进阶,

刨根问底,极致主义精神是必不可少的,

程序各个模块的生命周期了然于胸,

它们何时出生何时离去,它们到底做了什么?

这似乎是最简单的构造,析构函数,

但惭愧地发现自己亦有不甚透彻的点,

偶然看到一些象征的方式似乎很利于体悟,

为求之甚解,从最开始的地方开始,

略做总结一二:

1,如果说一个对象,相当于一个人,

构造函数,就相当于他的出生,人的基本出生状况(生理条件,Component)都是一样的,

所以,可以有多个构造函数的重载,但是基本的条件都是一样“一无所有”的(数据初始化、指针设NULL);

2,人有生,亦有死,想到这些,我们不必怅然,反而应该豁达,因为无论在漫漫人生路上我们获得了什么,最后也是一无所有的走的,尤其是赚到的金钱财富,享有的物质,民政部一定会把你注销户头(析构,必须清理掉所有的数据,尤其是申请的堆内存,并销毁指针设NULL),什么也带不到天国的(要不就是MemLeak);

3,话虽如此,人人生来在时间生命上自由平等,但是毕竟家庭,环境不同(有不同的构造函数),生来的贵贱贫富之分是在所难免的,但是王侯将相,宁有种乎?难道人的所有就只在出生一刻决定了么?!(构造时),不,还是有逆袭的机会的,所以,除了第一点提到的一无所有,所有的由外部参数决定的属性构造,我们都应将其独立地抽出为方法,如IniItems,IniMoney,以待不日之需;

4,一个人绝无可能使自己出生,但是悲伤的情绪还是会无情地将人打败,他有自杀的能力(对象不可以显式调用构造函数,但是可以调用析构函数),而且,考虑到有时候并非自杀,而是可能掉落峡谷,脱胎换骨,所以析构函数我们也应抽出为单独的方法,如CleanUpMoneyCleanUpItemsIniMoney可能只需要往上加钱就行(除非从高帅富坠落人间,Clean成破产),但是IniItems很可能会需要将原先的属性清除(IniItems先需要CleanUpItems);

5,正好展开来,对象指针和对象数据指针二者一定要清晰地分离,咋一看很简单,但现实往往却容易混淆,如高帅富坠落后因为由奢入简难而刷爆n张信用卡,然后就去delete自己,这不科学吧?!前面还有草莓味的妹子啊,决不能放弃!对象中数据不能影响到对象指针的任何可操作性;

6,人生在世,难免会遇到各种各样的人和事,靠谱的不靠谱的也很多,“你人生中最惊险的记忆是什么?”“额,二十多年前,后便追了几亿个弟兄,差点跑输了”...每当生活不如意时,时刻想想,我这么艰难的一刻都熬过来了,后面的各种属性方法,尤其是各种NULL野指针,岂不是责无旁贷?!Robustness鲁棒性一定要够!构造,析构时,一定要考虑到各种突发的情况;

7,声明时直接赋值,查看汇编代码,会发现直接调用的的是拷贝构造函数,而非重载的 =操作符;确切地说法是复制初始化赋值初始化展开来说,赋值初始化确切地说不属于构造函数范围,构造函数在编译级上我们就不能不能显式调用,但在成员函数中我们可以,但是自我规定,同样不要调用(如对象之前如果申请了一块内存,直接调用构造函数时,指针会被直接设NULL,而申请的内存却未释放),可以是复制初始化的构造函数(刚产生的对象)内部再去调用赋值初始化(已产生、刚产生的对象调用),这样之于人是一种专注的态度,专注于自身业务,最求最明晰的责任范畴,用于类,则可以避免很多问题。

 

抱歉!评论已关闭.