手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C++语言常见问题解答(1)B

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

 
======================================== 
 
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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!