有初始化“这个”您想要的物件。您能够用预设参数(default parameter),将两
个建构子合并起来,或是在私有的 "init()" 成员函数中共享他们的程式码。
========================================
Q19:解构子(destructor)是做什麽的?
解构子乃物件之葬礼。
解构子是用来释放该物件所配置到的资源,譬如:Lock 类别可能会锁住一个
semaphore,解构子则用来释放他。最常见的例子是:当建构子用了 "new" 以後,解
构子用 "delete"。
解构子是个「去死吧」的运作行为(method),通常缩写为 "dtor"。
=========================
■□ 第6节:运算子多载
=========================
Q20:运算子多载(operator overloading)是做什麽的?
他可让使用类别的人以直觉来操作之。
运算子多载让 C/C 的运算子,能对自订的型态(物件类别)赋予自订的意义。他
们形同是函数呼叫的语法糖衣 (syntactic sugar):
class Fred {
public:
//...
};
#if 0
Fred add(Fred, Fred); //没有运算子多载
Fred mul(Fred, Fred);
#else
Fred operator (Fred, Fred); //有运算子多载
Fred operator*(Fred, Fred);
#endif
Fred f(Fred a, Fred b, Fred c)
{
#if 0
return add(add(mul(a,b), mul(b,c)), mul(c,a)); //没有...
#else
return a*b b*c c*a; //有...
#endif
}
========================================
Q21:哪些运算子能够/不能被多载?
大部份都能够被多载。
不能的 C 运算子有 "." 和 "?:"(和以技术上来说,可算是运算子的 "sizeof")。
C 增加了些自己的运算子,其中除了 "::" 和 ".*". 之外都能够被多载。
底下是个足标(subscript)运算子的例子(他会传回一个参考)。最前面是“不用
”多载的:
class Array {
public:
#if 0
int& elem(unsigned i) { if (i>99) error(); return data[i]; }
#else
int& operator[] (unsigned i) { if (i>99) error(); return data[i]; }
#endif
private:
int data[100];
};
main()
{
Array a;
#if 0
a.elem(10) = 42;
a.elem(12) = a.elem(13);
#else
a[10] = 42;
a[12] = a[13];
#endif
}
========================================
Q22:怎样做一个 "**"「次方」运算子?
无解。
运算子的名称、优先序、结合律连同元数(arity)都被语言所定死了。C 里没有
"**" 运算子,所以您无法替类别订做一个他。
还怀疑的话,考虑看看 "x ** y" 和 "x * (*y)",这两者是完全相同的(换句话说
,编译器会假设 "y" 是个指标)。此外,运算子多载只是函数呼叫的语法糖衣而已
,虽然甜甜的,但本质上并未增加什麽东西。我建议您多载 "pow(base,exponent)"
这个函数(他的倍精确度版本在 中)。
附带一提:operator^ 能够用,但他的优先序及结合律不符「次方」所需。
===================
■□ 第7节:夥伴
===================
Q23:夥伴(friend)是什麽?
让别的类别或函数能存取到您的类别内部的东西。
夥伴能够是函数或其他类别。类别会对他的夥伴开放存取权限。正常情况下,程式员
会下意识、技术性地控制该类别的夥伴和运作行为(否则当您想更动类别时,还得先
有其他部份的拥有者之同意才行)。
========================================
Q24:「夥伴」违反了封装性吗?
若善用之,反而会「强化」封装性。
我们经常得将一个类别切成两半,当这两半各有不同的案例个数及生命期时。在此情
形之下,他们通常需要直接存取对方的内部(这两半“本来”是在同一个类别里面,
所以您并未“增加”存取资料结构的运作行为个数;您只是在“搬动”这些运作行为
所在之处而已)。最安全的实作方式,就是让这两半互为彼此的「夥伴」。
若您如上述般的使用夥伴,您依然是将私有的东西保持在私有的状态。碰到上述的情
况,假如还呆呆的想避免使用夥伴关系,许多人不是采用公共资料(糟透了!),就
是弄个公共的 get/set 存取运作行为来存取彼此的资料,事实上这些都破坏了封装
性。只有在类别的外面该私有资料「仍有其意义」(以使用者的角度来看)时,开放
出私有资料的存取运作行为才称得上是恰当的做法。多数情况下,「存取运作行为」
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




