多态与重载
多态
定义
多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
多态类型
多态性可以分为4类:重载多态,强制多态,包含多态和参数多态。
运算符重载
运算符重载就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。运算符重载的本质就是函数重载。
注意:运算符重载为类型的成员函数时,函数的参数个数比原来的操作个数要少一个;(后置++;- -除外)重载为非成员函数时,个数相同。
运算符重载为类的成员函数的一般语法形式为:
返回类型 operator运算符(形参表)
{
函数体
}
例子:复数类相加
首先定义一个复数类:
class Complex { //复数类定义
public:
Complex(double r=0.0,double i=0.0):real(r),imag(i){} //构造函数
void display() const; //显示复数的值
private:
double real, imag;
};
两个复数相加,用表达式“a+b”会编译出错,无法实现,所以这时候我们就可以用运算符重载。
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}
Complex operator+(const Complex& c2) const;//运算符+重载函数成员
Complex operator-(const Complex& c2) const;//运算符-重载函数成员
void display() const;//显示复数的值
private:
double real, imag; //复数虚部和实部
};
Complex Complex::operator+(const Complex& c2) const { //重载运算符函数实现
return Complex(real + c2.real, imag + c2.imag);//创建一个临时无名对象作为返回值
}
Complex Complex::operator-(const Complex& c2) const { //重载运算符函数实现
return Complex(real - c2.real, imag - c2.imag);//创建一个临时无名对象作为返回值
}
void Complex::display() const {
cout << "(" << real << "," << imag << ")" << endl;
}
int main() {
Complex c1(5, 4), c2(2, 10), c3;
cout << "c1=";
c1.display();
cout << "c2=";
c2.display();
c3 = c1 - c2; //使用重载运算符完成复数减法
cout << "c3=c1-c2=";
c3.display();
c3 = c1 + c2;
cout << "c3=c1+c2";//使用重载运算符完成复数减法
c3.display();
return 0;
}
小结:
(1)C++中的运算符除了少数几个之外,全部都可以重载,而且只能重载C++中已经有的运算符。
(2)重载之后运算符的优先级和结合性都不会改变。
(3)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。重载运算符函数可以对运算符做出新的解释,但原有基本语义不变:不改变运算符的优先级,结合性,所需要的操作数,并且不会创建新的运算符。