荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店