多态与重载

多态

定义

多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。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)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。重载运算符函数可以对运算符做出新的解释,但原有基本语义不变:不改变运算符的优先级,结合性,所需要的操作数,并且不会创建新的运算符。

posted @ 2019-10-27 10:20  卖女孩的男孩  阅读(210)  评论(0编辑  收藏  举报