c++中不仅提供函数重载,还有操作符重载,操作符重载一般是用于类的操作符重载。比如string的操作其实就是定义了一个特殊的类,并且提供一系列的函数使其类似于数据类型的。
重载操作符的方法:
函数:<函数类型>(类名::)operateor<运算符>(<形参表>)。
1.重载操作符函数的参数必须至少有一个是该类类型的对象。
2.操作符重载不能改变操作符的结合性和优先级。
3. 重载操作符函数不能有默认的参数。
比如以自增运算符重载举例:
#include <iostream>
using namespace std;
class A
{
public:
int m_data;
A& operator ++ ();
A operator ++ (int);
A()//默认构造函数
{
m_data = 0;
}
A(int a)//带参数的构造函数
{
m_data = a;
}
};
A& A:: operator ++ ()//重载前置自增操作符
{
cout << "前置自增" << endl;
m_data = m_data + 1;
return *this;
}
A A:: operator ++ (int)//重载后置自增操作符
{
cout << "后置自增" << endl;
A a = *this;
m_data = m_data + 1;
return a;
}
int main(void)
{
A a(2);
int test = 2;
//这段输出有点问题,输出是3 3,按道理应该像下面test输出一样2,4。通过重载函数的打印发现前置自增被先调用了
//推测可能是跟输出运算符<<或输出流的缓冲有关,等解决了再补充
cout << (a++).m_data << endl << (++a).m_data << endl;
cout << a.m_data << endl;//输出为4
//cout << (a++).m_data <<endl;//如果运行的是这两行则输出2,4。和预想的一样。
//cout << (++a).m_data <<endl;
cout << test++ << endl << ++test <<endl;
return 0;
}
1.成员函数:
要求第一个操作数必须为该类的对象(成员函数有一个隐含的this形参,限定其为第一个操作数。作为成员重载的操作符,要求访问重载函数的第一个操作数必须为该类的对象)所以上面那个前置自增实际上是有形参的;
赋值操作符必须为成员函数(复合赋值运算符和自增自减运算符也可以看做是赋值运算符)
单目运算符最好重载为成员;
举个例子:
class point
{
int a;
double b;
public:
point()//默认构造函数最好(一定)要有
{
a = 0;
b = 0;
}
point& operator = (const point& in)//成员函数
{
a = in.a;
b = in.b;
return *this;
}
}
2.友元函数:
双目运算符重载为友元函数比重载为成员函数更为方便(但是赋值运算符还是重载为成员函数为好,如果被重载为友元函数会出现与赋值语义不一致的地方);
关系操作符重载函数必须返回bool类型;
依然举个例子:
//类的定义同上个例子
friend point operator + (const point& in_1, const point& in_2)//友元函数重载运算操作符
{
point out;
out.a = in_1.a + in_2.a;
out.b = in_1.b + in_2.b;
return out;
}
friend bool operator == (const point& in_1, const point& in_2)//友元函数重载关系操作符
{
if(in_1.a == in_2.a && in_1.b == in_2.b)
return true;
else
return false;
}