荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: C++语言常见问题解答(1-4)C++基础
发信站: 荔园晨风BBS站 (Wed Sep 19 12:05:31 2001), 转信

=========================
■□ 第4节:C++ 的基础
=========================

Q10:什麽是类别(class)?

物件导向系统的基石。

类别是用来定义资料型态(data type)的,就像 C 的 struct 一样。
以资讯科学术语来说,一个型态包含了一组状态(state),以及在状态之间转移的
动作行为(operation)。因此 "int" 是个「型态」,因为它有一组状态,还有诸如

「加两个整数」、「整数相乘」等等的运作行为。同样的,「类别」提供一组(通常

是公共的)运算,及一组(通常是非公共的)资料栏位,以代表该型态的案例所拥有

的抽象值。以 C 的角度来看,类别就是其成员(members)皆预设为 "private" 的

struct。

把 "int" 想成是个类别,它拥有 "operator++" 等等的运作行为(method)。

========================================

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) { /*...*/ }

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.52.239]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店