定义一个重载运算符就像定义一个函数,只是该函数的名字是operator@,这里@代表运算符。比如返回类型 operator << (const class &c){}
重载运算符表中参数的个数取决于两个因素:
运算符是一元的(一个参数)还是二元的(两个参数)
对于一元运算符是一个参数,对于二元运算符是两个参数
对于一元运算符是没有参数,对于二元运算符是一个参数
c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。
在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里面定义了一个与操作符相关的函数。友元函数因为没有this指针,所以其形参相对成员函数的形参会多一个。
class A
{public:
A(int d):data(d){}
A operator+(A&); //成员函数A operator-(A&);
A operator*(A&);
A operator/(A&);
A operator%(A&);
friend A operator+(A&,A&);//友元函数friend A operator-(A&,A&);friend A operator*(A&,A&);friend A operator/(A&,A&);friend A operator%(A&,A&);private:
int data;
};//成员函数的形式
A A::operator+(A &a)
{return A(data+a.data);
}A A::operator-(A &a)
{return A(data-a.data);
}A A::operator*(A &a)
{return A(data*a.data);
}A A::operator/(A &a)
{return A(data/a.data);
}A A::operator%(A &a)
{return A(data%a.data);
}//友元函数的形式
A operator+(A &a1,A &a2)
{return A(a1.data+a2.data);
}A operator-(A &a1,A &a2)
{return A(a1.data-a2.data);
}A operator*(A &a1,A &a2)
{return A(a1.data*a2.data);
}A operator/(A &a1,A &a2)
{return A(a1.data/a2.data);
}A operator%(A &a1,A &a2)
{return A(a1.data%a2.data);
}//然后我们就可以对类的对象进行+、-、*、/了。
void main(void){A a1(1),a2(2),a3(3);a1=a2+a3;//或者
a1=a2.operator+(a3);
}
注意:在进行a2+a3的时候会出错,因为我们在上面对+定义了两种方法,去掉一种即可。
因为函数体比较简单,后面我就只给出成员函数形式的函数声明了,关系运算符有==,!=,<,>,<=,>=。
bool operator == (const A& );bool operator != (const A& );bool operator < (const A& );bool operator <= (const A& );bool operator > (const A& );bool operator >= (const A& );
bool operator || (const A& );bool operator && (const A& );bool operator ! ();
这里的+、-是正负的意思,放在对象前面。
A& operator + ();
A& operator - ();
A* operator & ();
A& operator * ();
++和–根据位置的不同有四种情况,都可以重载。
A& operator ++ ();//前置++A operator ++ (int);//后置++A& operator --();//前置--A operator -- (int);//后置--
按位操作。
A operator | (const A& );A operator & (const A& );A operator ^ (const A& );A operator << (int i);A operator >> (int i);A operator ~ ();
没有=哦。
A& operator += (const A& );A& operator -= (const A& );A& operator *= (const A& );A& operator /= (const A& );A& operator %= (const A& );A& operator &= (const A& );A& operator |= (const A& );A& operator ^= (const A& );A& operator <<= (int i);A& operator >>= (int i);
void *operator new(size_t size);void *operator new(size_t size, int i);void *operator new[](size_t size);void operator delete(void*p);void operator delete(void*p, int i, int j);void operator delete [](void* p);
上面的运算符重载都有两种方式,而下面的运算符只能用一种,特殊吧。
这些运算符的重载只能是成员函数。
而这些只能以友元函数的形式重载A& operator = (const A& );char operator [] (int i);//返回值不能作为左值const char* operator () ();T operator -> ();
//类型转换符
operator char* () const;operator int ();operator const char () const;operator short int () const;operator long long () const;//还有很多就不写了
friend inline ostream &operator << (ostream&, A&);//输出流friend inline istream &operator >> (istream&, A&);//输入流
两种重载方式的比较:
注意事项:
参考:http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html