========================================
Q11:什麽是物件(object)?
一块赋有某种语意的储存空间。
在宣告 "int i;" 之後,我们称「i 是个 int 型态的物件」。在 C /OOP 里,「物
件」通常意指「类别的案例(an instance of a class)」,因此类别定义了数个物
件(案例)的行为。
========================================
Q12:什麽是参考(reference)?
一个物件的“别名”(alias,另一个名称)。
参考通常用於传址呼叫(pass-by-reference):
void swap(int& i, int& j)
{
int tmp = i;
i = j;
j = tmp;
}
main()
{
int x, y;
//...
swap(x,y);
}
在这里 "i" 和 "j" 分别是是 main 函数中 "x" 和 "y" 的别名,换句话说,"i" 就
是 "x"--不是个指向 "x" 的指标,也不是 "x" 该值的复制品,而他的的确确就是
"x" 本身。您对 "i" 做的任何动作,都会反映到 "x" 上;反之亦然。
从最底层来看,参考最常用指标来实作,他的效果有点像 C 里头的「传指标呼叫」
(pass-by-pointer),但 "&" 取址运算子由呼叫者换到被呼叫者之处了,您也要删
去任何的 "*" 运算子。
========================================
Q13:假如设定某值给参考会怎麽样?
会更动到被参考者(referrent,该「参考」所参考到的物件)。
记住:「参考」就是「被参考者」,因此动了参考就会改变到被参考者(「参考」是
「被参考者」的左值 "Lvalue"〔出现在设定陈述的左边〕)。
更进一步,我们也允许参考被传回。这样子函数呼叫就可放在设定陈述的左边,这对
运算子多载的场合很有用。
========================================
Q14:怎样才能将参考改设成别的物件?
没有办法。
和指标不同,一旦参考被系结到某个物件,他就不能再被改设到其他物件去。「参考
」本身不是个物件(他自己没有位址;「取参考的位址」只会得到被参考者的位址
;切记:「参考」就是「被参考者」)。
将「参考」和「被参考者」分离开来是不可能的。
========================================
Q15:何时该用参考,何时又该用指标?
能够时,用参考;必要时,就用指标。
当您无需“重设”他时(见前一个问题),参考会比指标好。这通常意味著:在物
件类别的公共介面中参考最有用。参考大多用於物件的表层,而指标则多用於里层。
但有一个例外:当函数参数或传回值需要一个「临界」(sentinel)的参考值时,最
好是用指标来做,以 NULL 指标做为一个特别值(「参考」应该是个实质物件的「别
名」,而不是个解参用的〔dereferenced〕NULL 指标)。
注意:老资格的 C 程式员不喜欢参考,因为在父程式的地方,「参考」的语意并不
是那麽明显。然而有了些 C 经验後,会发现这正是一种「资讯隐藏」的作法,是利
而非弊。好比说,程式员应该以切近该问题的方式来写程式,而非以机器的语言来解
题。
========================================
Q16:行内函数是做什麽的?
行内函数(inline function)是个程式码会塞入呼叫者所在之处的函数。就像巨集
相同,行内函数免除了函数呼叫的额外负担,以增进效率,并且(尤其是!)还能让
编译器对他施以最好化(程式融合 "procedural integration")。但是和巨集不同
的是:他只会对任何引数求一次的值(在语意上,该“函数呼叫”和正常函数相同,
只是比较快速罢了),以避免某些不易察觉的巨集错误。此外,他还会检测引数的型
态,做必要的型别转换(巨集对您有害;除非绝对必要,否则别再用他了)。
注意:过度使用行内函数会让程式码肥胖,於分页(paging)环境下反而有负面的性
能影响。
宣告法:在函数定义处使用 "inline" 关键字:
inline void f(int i, char c) { /*...*/ }
或是在类别内将定义包括进去:
class Fred {
public:
void f(int i, char c) { /*...*/ }
};
或是在类别外头,以 "inline" 来定义该成员函数:
class Fred {
public:
void f(int i, char c);
};
inline void Fred::f(int i, char c) { /*...*/ }
=============================
■□ 第5节:建构子和解构子
=============================
Q17:建构子(constructor)是做什麽的?
建构子乃用来从零开始建立物件。
建构子就像个「初始化函数」;他把一堆散乱的位元组成一个活生生的物件。最低限
度他会初始化内部用到的栏位,也可能会配置所须的资源(记忆体、档案、semaphore
、socket 等等)。
"ctor" 是建构子 constructor 最常见的缩写。
========================================
Q18:怎样才能让建构子呼叫另一个同处一室的建构子?
没有办法。
原因是:假如您呼叫另一个建构子,编译器会初始化一个暂时的区域性物件;但并没
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




