登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

明月凉

再不记录,就忘了

 
 
 

日志

 
 

C++面向对象3  

2011-10-12 20:21:52|  分类: 计算机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

运算符重载

重载的实现方法就是定义一个函数,让这个函数来完成功能

运算符重载的实质其实就是函数重载,跟据参数类型、个数的不同,系统选择执行不同的函数

这样子的:

函数类型  operator   运算符名称(形参)

{函数体}

重载“+”,实现复数相加

#include <iostream>
using namespace std;
class Complex
{public:
 Complex(){real=0;imag=0;}
 Complex(double r,double i){real=r;imag=i;}
 Complex operator +(Complex &x);
 void display();
private:
 double real;
 double imag;
};
Complex Complex::operator +(Complex &x)
{Complex c;
c.real=real+x.real;
c.imag=imag+x.imag;
return c;
}
void Complex::display()
{cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{Complex c1(3,4),c2(5,6),c3;
c3=c1+c2;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}

这里这个重载函数是类的成员函数

“operator +”是一个整体,它就是函数名,我们这样说:函数operator +重载了运算符+

机器对c1+c2的理解,解释为   c1.operator +(c2),也就是以c2为参数,调用c1的operator +函数。

上面这个程序中,声明对象c3,c1+c2执行后会返回一个对象,这个对象赋值给了c3,所以c3.display()能得到正确的结果

编译系统根据表达式的上下文决定用那一个重载函数。

 

重载还是有一些个规则的:

只能对C++原本的运算符重载,不能自创;有5个运算符不能重载(sizeof、?:、::、. 、.* );操作数,优先级,结合性不能变;参数不能全是C++标准类型,至少得有一个是自定义的类对象;“=”和“&”不必重载。重载函数可以是成员函数、友元函数、也可以都不是。

 

上面那个是成员函数,它计算的时候,直接能调用c1的成员(对象c1)和参数c2的成员进行运算。

也可以是友元函数,这时,得这样:c.real=c1.real+c2.real;,是吧

class Complex
{public:
 Complex(){real=0;imag=0;}
 Complex(double r,double i){real=r;imag=i;}
 friend Complex operator +(Complex &x,Complex &y);
 void display();
private:
 double real;
 double imag;
};
Complex operator +(Complex &x,Complex &y)
{Complex c;
c.real=x.real+y.real;
c.imag=x.imag+y.imag;
return c;
}

上面的函数可以更简便:

Complex operator +(Complex &c1,Complex &c2)

{return Complex(x.real+y.real,x.imag+y.imag);}

 

至于普通函数,它不能直接访问类的私有成员,所以不是很好用的

对于成员函数和友元函数的选择:

看成员函数,比如c1+c2,它以c2为参数,调用c1的成员函数,所以,用成员函数时,表达式的第一个参数是类对象,返回的也是类对象。

看友元函数,它就能处理i+c1这种形式,如

Complex operator +(int &1,Complex &c)

{return Complex(i+c.real,c.imag);}

 

在C++中,一般将单目运算符重载为成员函数,将双目重载为友元函数,(虽然友元的使用会破坏类的封装性)。

对“<<”和“>>”的重载:

#include <iostream>
using namespace std;
class Complex
{public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator +(Complex &c2);
friend ostream & operator <<(ostream&,Complex&);
private:
double real;
double imag;
};

Complex Complex::operator +(Complex &c2)
{return Complex(real+c2.real,imag+c2.imag);
}

ostream& operator <<(ostream& output,Complex& c)
{output <<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
return output;
}

int main()
{Complex c1(2,4),c2(6,10),c3;
c3=c2+c1;
cout<<c3;
return 0;
}

对<< 和 >>重载的形式如下:

istream& operator >>(istream &,自定义类&);

ostream& operator <<(ostream&,自定义类 &);

注意参数,因为第一个参数是固定的,所以这两个只能做成友完函数或普通函数。

对cout<<c3;的解释,是operator <<(cout,c3);所以ostream& operator <<(ostream& output,Complex& c)中的output只是个形参,是被cout给替换了的。

然后,return output,现在知道实际是return cout,现cout的现状返回。

对>>的重载:

istream & operator >>(istream & input,Complex & c)
{cout<<"Input real and imag:";
input>>c.real>>c.imag;
return input;
}

  评论这张
 
阅读(376)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018