C++(5):运算符重载

来源:互联网 发布:天津建经软件 编辑:程序博客网 时间:2024/04/29 07:06

引言


函数重载,function overloading。

同名异式,即重载。

虽然函数名相同,但也许是输入参数类型不同,个数不同,等等……

这就是重载。


运算符,operator,似乎也可以归为函数。c++里面, 有些运算符已经被重载过了。只是,我太无知,不懂而已……

就像减号(-)。

3-1,是算术的减号,

-1,是负数的符号,

……

下面,总结一些重要的、常见的运算符的重载。

运算符重载,一般有作为成员函数重载和作为友元函数重载这两种。


先定义一个自己的复数类。 complex number。头文件里基本是这样。

class CComplex{public:CComplex();CComplex(double real,double imag);private:        double real;        double imag;}

现在要重载 == 号,判断两个复数是否相等。


作为成员函数重载


overloading as a member function.
写在class里面,public修饰符后面。这是头文件中的内容。
class CComplex{public:CComplex();CComplex(double real,double imag);   bool operator==(const CComplex & c1);}
外面的实现,就是
bool CComplex :: operator==(const CComplex & x) {    return ((this->real == x.real) && (this->imag== x.imag));}
例子虽小,但有2点值得注意

1. 竟然可以通过 “.” 一点,把x的私有real点出来。为什么?因为此时的==号是CComplex这个class的成员函数!
CComplex这个类的成员函数,是可以访问CComplex对象的任何成员的!

2. 比较两个复数是否相等,本来是两个数在比,为什么这个函数的输入参数竟然只有一个?
因为已经把==号作为member function去重载了。比较obj1和obj2的时候,相当于是通过 obj1 ,去调用obj1的==成员函数,
所以此时只需要再给另一个输入参数 obj2 就好了。

作为友元函数重载


overloading as a friend function.
声明在类内部,前面用friend加以修饰,然后是函数。
注意,friend function不是member function!!!!头文件里,声明的时候这么写。
friend bool operator==(const CComplex & , const CComplex &);
在外面实现的时候,这么写。
bool operator==(const CComplex & o1, const CComplex & o2){return ((o1.real==o2.real)&&(o1.imag==o2.imag));}
注意,千万不能写(CComplex :: xxx)。本来就不是成员函数,根本不属于CComplex这个类。
因为,这不是成员函数,所以,比较两个复数是否相等,需要提供两个输入参数,即上面的o1 和 o2 。

其他一些运算符的重载


++、-- 运算符


++、--运算符的重载,写法及注意事项,请参考前文。
注意,前置++是支持连续++的,但是后置++不支持连续++的。至于原因,
请直接review:++i,i++,++++i,i++++

<<、>> 运算符


以前写JAVA的时候,有个很方便的工具叫MyEclipse,有个功能refactor,可以自动生成一个 toString() 的函数。
现在在C++里面,希望也能直接通过 << 把某个对象 obj 的成员属性都打出来。于是,需要重载 << 号。对 >> 的需求也类似。
因为有语法规定,<< 或 >> 不能作为member function去overloading。所以,一般会把 <<  或 >> 作为friend function去overloading。
因为,有一种用法是
cout<<"Hello"<<" "<<"world!"<<endl;
<<是支持连续<<的,>>也类似。所以,在overload <<或>>的时候,类型为ostream或istream的对象s,
需要一直是引用!而不是拷贝!返回也需要返回引用!而不是拷贝!是reference,不是copy,不是assign!

重载 <<

在类里面声明的时候,写为
friend ostream & operator<<(ostream &os, const CComplex & c1);
在类外面实现的时候,写为
ostream & operator<<(ostream &os, const CComplex & c1) {os<<"( "<<c1.real<<", i"<<c1.imag<<")";return os;}
从此以后,就可以写
CComplex c1(0,0), c2(0,1);cout<<"c1="<<c1<<","<<"c2="<<c2<<endl;
了。

重载 >>
在类里面声明的时候,写为
friend istream & operator>>(istream & is, CComplex & o);
在类外面实现的时候,写为
isteram & operator>>(istream & is, CComplex o) {      is>>o.real>>o.imag;      return is;}

[ ] 下标运算符的重载


[ ] 的重载,据说一般是用来检查是否越界。
两点注意。
1. 只能作为 member function 重载;
2. 只能返回对象本身(即ref)。



0 0