c++第五次作业 重载与多态

多态与重载

多态性是面向对象程序设计的重要特性之一。多态是会一个名字有很多种语义,或一个相同界面有很多多种实现;或是指发出同样的消息被不同类型的对象接收而导致完全不同的行为,即对象根据所接收到的消息做出相应的操作。

消息主要是指对象成员函数的调用,不同的行为指不同的实现。

多态的实现

1.函数重载

2.运算符重载

3.虚函数

成员函数重载有三种方式:

1.在一个类中重载:参数的特征区分;例如:
show(int, char); show(char*, float);

2.在不同类中重载:实用类作用域符::加以区分(不同类中重载,静态成员函数),例如:
Circle::show(); Point::show();

3.根据类对象加以区分(不同类中重载,不同成员函数),例如:
acircle.show() 调用 Circle::show()
apoint.show() 调用 Point::show()

运算符重载

运算符重载是对已有的运算符富余多重含义。有两种方式:

1.重载为成员函数

2.重载为友元函数

声明形式:

函数类型   operator 运算符 (形参)
{
    body;
}

重载为类成员函数时:
参数个数 = 原操作数个数 - 1(后置++ 、 --除外)

重载为友元函数时:
参数个 = 原操作数个数,且至少应该有一个自定义类型的形参。
由于友元函数不是任何类的成员函数,因此重载是必须在参数表中显示的给出所有的操作数。

 

实现2个复数对象的加法运算,add 成员函数与“+”运算符重载为友元函数

#include <iostream>
using namespace std;
class complex    //复数类声明
{public:    //外部接口
    complex(double r=0.0,double i=0.0)//构造函数
    {real=r;imag=i;}
    friend complex add(complex &c1,complex &c2); //add2个复数友元函数    
    friend complex operator +(complex &c1,complex &c2); //+重载为友元函数
    void Show();    //输出复数
private:    //私有数据成员
    double real;    //复数实部
    double imag;    //复数虚部
};    
complex  add(complex &c1,complex &c2) //通过友元函数实现
{    complex t;
    t.real=c1.real+c2.real;
    t.imag=c1.imag+c2.imag;
    return t;
}
complex  operator +(complex &c1,complex &c2) //通过友元函数重载+运算符 
{    complex t;
    t.real=c1.real+c2.real;
    t.imag=c1.imag+c2.imag;
    return t;
}
void complex::Show()
{    cout<<"("<<real<<","<<imag<<")"<<endl; 
}
int main()     //主函数
{    complex z1(1.5,2.8),z2(-2.3,3.4),z3,z4    z3=add(z1,z2);//友元函数调用    cout<<"z3=";
    z3.Show();
    z4=z1+z2;//+运算符重载 
    cout<<"z4=";
    z4.Show();    
    return 0;
}

实现2个复数对象的加法运算,add 成员函数与 “+”运算符重载为成员函数

#include <iostream>
using namespace std;
class complex    //复数类声明
{
public:    //外部接口
    complex(double r=0.0,double i=0.0){real=r;imag=i;}//构造函数
    complex add(complex &c2); //add成员函数
    complex operator +(complex &c2); //+重载为成员函数
    void Show();    //输出复数
private:    //私有数据成员
    double real;    //复数实部
    double imag;    //复数虚部
};    
complex  complex::add(complex &c2) //通过成员函数实现
{    complex t;
    t.real=real+c2.real;
    t.imag=imag+c2.imag;
    return t;
}
complex complex::operator +(complex &c2)  //重载+运算符为成员函数
{    complex t;
    t.real=real+c2.real;
    t.imag=imag+c2.imag;
    return t;//相当于return complex(t.real,t.imag);
}
void complex::Show()
{    cout<<"("<<real<<","<<imag<<")"<<endl; 
}
int main()     //主函数
{    complex z1(1.5,2.8),z2(-2.3,3.4),z3,z4    z3=z1.add(z2);//成员函数调用
    cout<<"z3=";
    z3.Show();
    z4=z1+z2;//+运算符重载 
    cout<<"z4=";
    z4.Show();    
    return 0;
}

 

posted on 2019-10-27 17:12  .lyt  阅读(228)  评论(0)    收藏  举报