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

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

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

有初始化“这个”您想要的物件。您能够用预设参数(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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!