按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 不同派生方式得到