【C++】三大特征之多态性(运算符重载)

一、什么是面向对象的三大特征

封装、继承和多态

二、什么是多态

多态性,可以理解为多种状态

C++主要支持两种多态,函数重载运算符重载。都属于静态动态

三、分析运算符重载

(1)运算符的重载的分类

运算符重载又可以分为:

重载为成员函数

重载为友元函数

(2)代码块

①重载为友元函数:

#include
//运算符重载为友元函数 
using namespace std;
class complex//定义一个复数类 
{
 public:
  complex(){real=imag=0;}//构造函数 
  complex(double r,double i){real=r;imag=i;}//构造函数重载 
  friend complex operator +(const complex &c1,const complex &c2);//分别进行加减乘除的运算符重载 
  friend complex operator -(const complex &c1,const complex &c2);
  friend complex operator *(const complex &c1,const complex &c2);
  friend complex operator /(const complex &c1,const complex &c2);
  friend void print(const complex &c);//将输出函数重载为友元函数 
 private:
  double imag,real;//定义私有成员 imag,real; 
};
//加法
complex operator +(const complex &c1,const complex &c2)
{
  return complex(c1.real+c2.real,c1.imag+c2.imag);
}
//减法
complex operator -(const complex &c1,const complex &c2)
{
  return complex(c1.real-c2.real,c1.imag-c2.imag);
}
//乘法
complex operator *(const complex &c1,const complex &c2)
{
  return complex(c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c1.imag*c2.imag);
}
//除法
complex operator /(const complex &c1,const complex &c2)
{
  return complex((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));
} 
//打印
void print(const complex &c)
{
 cout<

②重载为成员函数:

class complex//定义一个复数类 
{
 public:
  complex(){real=0;imag=0;}
  complex(double r,double i){real=r;imag=i;}
  complex operator +(const complex &c);//const complex &c 是参数表。之所以用常引用是因为比较安全  注: const是定义一个不可改变的常量,‘&’代表引用;
  complex operator -(const complex &c);
  complex operator *(const complex &c);
  complex operator /(const complex &c);
  friend void print(const complex &c);
 private:
  double imag,real;
};
inline complex complex::operator +(const complex &c)//inline 内联函数 :和宏定义的效率是一样的,但是他更优越一些,它与一般函数更贴近,调试方便
{
 return complex(real+c.real,imag+c.imag);
}
//减法
inline complex complex::operator -(const complex &c)
{
 return complex(real-c.real,imag-c.imag);
}
//乘法
inline complex complex::operator *(const complex &c)
{
 return complex(real*c.real-imag*c.imag,real*c.imag+imag*c.imag);
}
//除法
inline complex complex::operator /(const complex &c)
{
 return complex((real*c.real+imag*c.imag)/(c.real*c.real+c.imag*c.imag),(imag*c.real-real*c.imag)/(c.real*c.real+c.imag*c.imag));
}
//打印
void print(const complex &c)//引用的可以看做是  用 “&”代替了 “*”;
{
 cout<


 
  

主函数,做运行时用

//main
int main()
{ 
 complex c1(3,2),c2(1,1),c3; 
 cout<<"c1:";print(c1);
 cout<<"c2:";print(c2);

 //加法
 c3=c1+c2;
 cout<<"c3=c1+c2=";
 print(c3);

 //减法
 c3=c1-c2;
 cout<<"c3=c1-c2=";
 print(c3);

 //乘法
 c3=c1*c2;
 cout<<"c3=c1*c2=";
 print(c3);

 //除法
 c3=c1/c2;
 cout<<"c3=c1/c2=";
 print(c3);

 //综合式
 c3=c1/c2+(c2+c1)*c1;
 cout<<"c3=c1/c2+(c2+c1)*c1;"; 
 print(c3);

}

(3)两种方法的区别

重载为成员函数:

<1>格式:<类型说明符>operator<运算符>(<参数表>)

<2>程序会将表达式:c1+c2;

程序解释为:c1.opetator(c2)

重载为友元函数:

<1>格式: friend<类型说明符>operator <运算符>(<参数表>)

<2>程序给会将表达式:c1+c2

程序解释为:operator(c1+c2);


你可能感兴趣的:(C++)