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

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

封装、继承和多态

二、什么是多态

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

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

三、分析运算符重载

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

运算符重载又可以分为:

重载为成员函数

重载为友元函数

(2)代码块

①重载为友元函数:

<pre name="code" class="cpp">#include<iostream>
//运算符重载为友元函数 
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<<c.real<<"+";
 if(c.imag<0)
  cout<<c.imag<<"i"; 
 else 
  cout<<c.imag<<"i";
 cout<<endl;
}

②重载为成员函数:

<pre name="code" class="cpp">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<<c.real<<"+";
 if(c.imag<0)
  cout<<c.imag<<"i"; 
 else 
  cout<<c.imag<<"i";
  cout<<endl;
}


 

主函数,做运行时用

</pre><pre name="code" class="cpp">//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);


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值