[原创文章欢迎转载,但请保留作者信息] Justin 于 2009-12-29
上课上到第5章,大师开始讲“实现”(implementation)。
第26条还是比较容易读,讲的是一个习惯问题:到使用变量的时候再定义它。 不知道是在小时候学Pascal得到的印象还是C语言课老师传授的“腐朽思想”,在函数/文件的开始总是要定义所有的变量。 大师说:这样不对。
原因是:
-
定义变量包含了该变量对象的构造操作,如果因为某个原因(如抛出异常,条件语句未执行等)而没有真正用到这个变量,那么构造该变量所耗费的时间和资源就白费了。
-
在即将使用变量前再定义它对理解代码也有好处:要想知道某个变量时做什么用的?读接下来的代码便是。
其实课上到这里也该算完了,不过Scott还是留了一道简单又不简单的思考题,以及答案:
//方法A:循环外定义 Widget w; for (int i = 0; i < n; ++i){ w = some_value_dependent_on_i; //.. }
//方法B:循环内定义 for (int i = 0; i < n; ++i) { Widget w(some_value_dependent_on_i); //.. } 题目抄完了,问题是:A和B哪种变量声明的方式更合适?
【解析】 方法A调用了1次构造函数、1次析构函数、n次拷贝函数;
方法B调用了n次析构函数、n次析构函数。
当拷贝操作的开销比构造-析构操作要廉价的时候,一般来说A方法是上选。
但是A方法中对象的作用域比B方法中更大,也就违背了代码的集中性和可维护性原则。
因此,除非
拷贝操作比构造-析构操作开销小,并且此部分代码对性能(performance)要求很高,(此时选择为A)
否则B方法还是更合理。
【答案】没有标准答案@#¥%
|