一、运算符重载
(一) 运算符重载的定义
运算符重载就是对现有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
所谓重载,就是重新赋予新的含义。
形式如下:
返回类型 operator运算符号(形式参数列表)
{
函数体
}
具体例子:
class complex//复数类
{
public:
complex(double r=0.0,double i=0.0)//构造函数
{real=r;imag=i;}
private:
double real;
double imag;
};
将‘+’用于复数类的加法运算,运算符函数原型可以是:
complex operator+(const complex &a,const complex &b);
调用运算符函数的形式如下:
operator 运算符号(实参列表);
(二)运算符重载的规则
1、重载运算符的限制
(1)可以重载的运算符:
+ - * / % ^ & | ~
! = < > += -= *= /= %=
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ' ->
[ ] ( ) new delete
(2)不建议重载的运算符:
逻辑与(&&)、逻辑或(‖)、逗号运算符(,)
(3)重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
1)不改变运算符的优先级
2)不改变运算符的结合性
3)不改变运算符所需要的操作数
4)不能创建新的运算
注:
1)运算符重载函数不能使用默认参数
2)重载运算符必须具有一个类对象(或类对象的引用)的参数,不能全部是C++的内置数据类型。
3)一般若运算结果作为左值则返回类型为引用类型;若运算结果要作为右值,则返回对象。
4)重载运算符的功能应该与原来的功能一致。
2、
将运算符重载为类的成员函数,一般形式为:
class 类名{ //类体 …… 返回类型 operator 运算符号(形式参数列表) {
函数体
} ……
};
或
class 类名{ //类体 …… 返回类型 operator 运算符号(形式参数列表); ……
};
返回类型 类名::operator 运算符号(形式参数列表) {
函数体 }
当运算符重载为友元函数时,运算符函数的形式参数的个数和运算 符规定的运算对象个 数一致。
形式如下:
class 类名{ //类体 …… //友元声明 friend 返回类型 operator 运算符号(形式参数列表);
};
返回类型 operator 运算符号(形式参数列表) {
函数体 }
二、组合与继承
(一)组合
将一个类的对象作为另一个类的成员,称作组合或包含。
(二)继承
1、继承与派生的概念
一个新类从已有的类那里获得其已有特性,这种现象称为继承。
从已有的类产生一个新的子类,称为类的派生。
一个派生类只从一个基类派生称为单继承;
一个派生类有两个或多个基类称为多继承。
2、派生类的声明方式
声明派生类的一般形式为:
<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"><strong>class 派生类名: [继承方式] 基类名
{
派生类新增加的成员;
};</strong>
</span>
3、 派生类的构成
(1)从基类接收成员;接收基类的全部成员,但不包括构造函数和析构函数。
(2)调整从基类接收的成员。指定继承方式调整访问属性。在派生类中声明一个与基类成员同名的成员,则新成员会覆盖基类的同名成员。
(3)在声明派生类时增加成员。自己搞定构造函数和析构函数。
4、 三种继承方式:
(1) 公用继承 基类的公用成员和保护成员保持原有的访问属性,其私有成员仍为基类所私有,派生类不可访问。
(2) 私有继承 基类的公用成员和保护成员成为派生私有成员,只有派生类成员函数能够访问,派生类外不能访问,其私有成员仍为基类所私有,派生类不可访问。
(3) 保护继承 公用成员和保护成员成为派生类保护成员,其私有成员仍为基类所私有,派生类不可访问。
三、虚函数与多态
(一)多态性
多态性可以简单概括为“一个接口,多种行为”。
向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
多态分为两种:
1、编译时多态:主要通过函数的重载和模板来实现。
2、运行时多态:主要通过虚函数来实现。
多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现。、
(二)动态联编
1、虚函数和基类指针
写有关键字virtual的成员函数称为虚函数,实现运行多态的关键是要说明虚函数,另外必须用基类指针调用派生类的不同实现版本。
2、虚函数的重载特性
在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同, 如果仅仅返回类型不同,C++认为是错误重载,如果函数原型不同,仅函数名相同,丢失虚特性
3、虚析构函数
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数, 析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象
(三)纯虚函数和抽象类
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本。
纯虚函数为各派生类提供一个公共界面
纯虚函数说明形式:
virtual 类型 函数名(参数表)= 0 ;
一个具有纯虚函数的基类称为抽象类。