友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第19章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                             算符函数的参数表却可以拥有 

                             多个参数。  



                             2。  函数调用运算符作用于一个 

                             类的实例对象,而不是一个函 

                             数名。  



                             关于函数调用运算符可以参见 

                             前面的类matrix的实现。假设A 

                             是类matrix的一个实例对象, 

                             则表达式A(1;2)返回矩阵A中第 

                             一行第二列的元素。  



下标运算符''                      type operator''(arg)  

               



                             表达式A'arg'等价于 

                             A。operator''(arg)  



                             注意:  



                             除了可以为整数以外,下标运 

                             算符函数的参数arg还可以为任 

                             何类型,比如,你可以创建一 

                             个以字符串为下标的数据列 

                             表。  



成员函数运算                       type operator…》(arg)  

               

符…》  


…………………………………………………………Page 83……………………………………………………………

                                表达式A…》arg等价于 

                                A。operator…》(arg)  



                                注意:  



                                可以重载成员选择运算符 “

                                》”,但不可以重载另一个成员 

                                选择运算符 “。”。  



type& operator++(type&)  



或  



type type::operator…()  



type operator…(type&)  



要注意的是,如果使用将operator++和operator……重载为全 

局友元函数,则参数要使用引用类型,这是因为一般来说, 

运算符 “++”和 “”都需要修改操作符本身。  



对于后缀形式的递增/递减运算符,我们约定使用下面的方式 

来进行重载:  



type& type::operator++(int)  



type& operator++(type&; int)  



或  



type type::operator…(int)  



type operator…(type&; int)  



也就是说,我们使用一个额外的整型参数来表明所需调用的 

是后缀形式的递增/递减运算符。这样,表达式  



++A  



对于编译器等价于  



A。operator++()  



或  



operator++(A)  


…………………………………………………………Page 84……………………………………………………………

而表达式  



A++  



对于编译器等价于  



A。operator++(0)  



或  



operator++(A; 0)  



运算符 “”与此类似。  



这样,编译器就能有效的区分前缀形式的递增/递减运算符和 

后缀形式的递增/递减运算符,对于Visual C++而言,传递给 

后缀形式的递增/递减运算符函数的整型参数为0,事实上, 

我们可以显式的调用后缀形式的递增/递减运算符函数,如  



A。operator++(3);  



或  



operator++(A; 3);  



这时,所传递的整型参数可以不是0,而且,后缀形式的运算 

符函数operator++也的确可以使用这个参数,这时, “++” 

运算符看起来有点像一个二元运算符,但是,要记住,后缀 

形式的运算符函数operator++只是一个约定,对于C++来说, 

无论使用的是前缀形式还是后缀形式,递增/递减运算符都是 

一个一元运算符,下面的表达式在Visual                 C++中是通不过 

的:  



A++3;  



不要想当然的将它解释为  



A。operator++(3);  



或  



operator++(A; 3);  



  n 注意:  



  n 由表2。3可以知道,用于动态分配内存的运算符new和 


…………………………………………………………Page 85……………………………………………………………

   delete也可以被重载,但是,C++对这两个运算符的默认 

   实现非常之好,而且,由于Win32平台的32位平坦 内存管 

   理机制,在系统物理内存不足时会 自动使用磁盘交换文 

   件,因此,在绝大多数情况下,我们不需要、也不应该 

   重载new和delete运算符,而且,不正确或者说不完善的 

   重载new和delete有可能在动态分配内存时带来难以预料 

   的严重后果。也鉴于这个原因,本书中不再讲述重载new 

   和delete运算符的细节,若读者在程序中的确需要重载 

   它们的话,请参考Visual C++的联机文档或其它的C++文 

   献。  



  n 重载运算符时应该遵从惯例,比如说,我们可以重载运 

   算符 “+”来连接两个字符串,这是合乎我们的日常思维 

   方式的。同样,C++允许我们使用运算符 “”来连接两 

   个字符串,但是,这样的重载方式不会给编程带来方 

   便,它们只会混淆程序员的思维,因此是应该避免的。  



            第三节 类的继承  



类的派生(derivation)和继承 (inheritance)是面向对象程序 

设计中的一个很重要的概念。通过这种被称作继承的机制, 

可以从已有的类派生出新的类,新的类包括了已有类的全部 

接口 (interface),而且还可以包括特有的新的接口,从而实 

现我们在2。1。3小节中提出的继承结构。本节讲述使用C++编 

程语言来实现继承机制的具体的语法细节。  



在C++中,若我们从类A派生出新的类B,那么,称类A为类B的 

基类 (base class),而类B为类A的派生类 (derived class)  



2。3。1 单一派生  



所谓的单一派生是指一个派生类只能有一个直接基类。什么 

叫直接基类呢?假设我们从类A派生出类B,然后又从类B派生 

出类C,那么,类B就是类C的直接基类,与之相对比,我们称 

类A为类C的间接基类。这一关系可以用图2。5表示。  


…………………………………………………………Page 86……………………………………………………………

                                         



                         图2。 5 单一继承结构  



下面的代码实现了上面的结构:  



class A  



{  



// 在此添加类A的实现  



// 。。。  



};  



class B:public A  



{  



// 在此添加类 B 特有的实现  



// 。。。  



};  



由上面的代码可以看出,类的单一派生使用如下的语法:  



class class…name : access…specifier base…class  



{  



// 派生类的新增成员  



};  



其中class…name是派生类的类名,access…specifier指定了 

基类的继承方式,可以使用的关键字包括public   (如前面的 

例子所示)、private和protected,它们的作用我们将在下面 

作说明,base…class是基类的类名。  



同指定类中的成员的访问权限相仿,我们可以使用访问限定 

关键字指定派生类对基类成员的访问权限。对于使用不同方 


…………………………………………………………Page 87……………………………………………………………

式 (public、private和protected)派生的类,对于基类中以 

不同方式 (public、private和protected)定义的成员的访问 

限制是不同的。我们在前面讲述类中成员的访问限制时已在 

前面的表2。2中已经给出了不同派生方式不区别,为了叙述方 

便,这里将与本节有关的内容重新列于表2。6。  



        表2。 6 不同派生方式得到
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!