一、什么是面向对象的三大特征
封装、继承和多态
二、什么是多态
多态性,可以理解为多种状态
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);