西西河

主题:【原创】猛批烂书 程序员面试宝典 上 -- 晨池

共:💬64 🌺96
全看分页树展 · 主题 跟帖
家园 花你的认真哈

看得我手痒,也来说几句

但是inline在和宏相比没有付出任何额外代价的情况下更安全

这个得看编译器。对Borland的编译器,在优化全开的情况下,inline函数的调用,其形参和局部变量必须在栈上实际分配,而无论函数多么短小。这样,对短小的函数,inline不inline其实效率差不多。但宏就不一样了。

还有那个把fact(8)优化成push 40h,涉及到两个编译优化,其一是inline展开,其二是常数的扩展(即在编译状态下可确定为常数的变量被替换成相应常数)。单纯地说,inline展开是确实有的,只是两个编译优化共同作用下看不到了。

C. It can not be used explicitly in memeber function of class X. (不能在类的成员函数里明确的声明)

这里的中文翻译有点小问题。“used”应该是使用的意思,而不是声明。我的翻译是“不能在类成员函数显式使用this指针”。这显然是错误的,所以是该题的答案。

vector<CDemo> *a1 = new vector<CDemo>();

a1->push_back(d1);

delete a1;

这个,在我上课的时候被用于最经典的C++指针误用例子。为什么呢?我把正确的用法写出来大家应当就知道了:

vector<CDemo> a1;

a1.push_back(d1);

不过,几乎所有现在的C++语法书介绍指针的时候,竟然都是类似的例子......

另外上面的代码可能存在一个严重的问题,因为我从来不用STL所以不确定。“vector<CDemo>” 应当以CDemo对象为元素,那么push_back的时候,d1将被复制一份。而CDemo的复制函数,在第一个版本中,是编译器缺省生成的......第二个版本加了复制构造函数应当没有问题。当然,如果vector<CDemo>内部用指针来管理元素,那也可能没有这个问题,但会引发另外的问题......反正问题很严重。这也是我从来不用STL的原因:吖的封了一层又一层,谁知道你里面是怎么实现的?我用复杂的数据结构说明我的算法复杂,要对实现细节进行把握才能获得预期的高效,现在我啥都不知道了,谁敢保证我的算法不踩地雷?

还有这个:

CDemo d1;

d1.str = new char[32];

个人认为这个CDemo类实在是一个糟糕得不能再糟糕的例子......

通宝推:铁手,
全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河