运算符重载
例1:通过函数来实现复数相加
cpp
#include <iostream>
using namespace std;
class Complex
{
public:
Complex() { real = 0; imag = 0; }
Complex(double r, double i) { real = r; imag = i; }
Complex complex_add(Complex& c2);
void display();
private:
double real, imag;
};
Complex Complex::complex_add(Complex& c2)
{
Complex c;
c.real = real + c2.real;
c.imag = imag + c2.imag;
return c;
}
void Complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
Complex c1(3, 4), c2(5, -10), c3;
c3 = c1.complex_add(c2);
cout << "c1 = ";
c1.display();
cout << "c2 = ";
c2.display();
cout << "c1 + c2 = ";
c3.display();
return 0;
}
运算符重载的方法
运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新功能。在使用被重载的运算符时,系统就自动调用该函数,以实现相应的功能,运算符重载实质上是函数的重载。
重载运算符的函数一般格式如下
函数类型 operator 运算符名称(形参表)
{对运算符的重载处理}
其中operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C++已有的运算符,函数名是由operator和运算符组成,如operator+为函数名,意思是对运算符+重载的函数。
例2:对运算符+实行重载,使之能用于两个复数相加。
cpp
#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);
void display();
private:
double real, imag;
};
Complex Complex::operator+(Complex& c2)
{
Complex c;
c.real = real + c2.real;
c.imag = imag + c2.imag;
return c;
}
void Complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
Complex c1(3, 4), c2(5, -10), c3;
c3 = c1 + c2;
cout << "c1 = ";
c1.display();
cout << "c2 = ";
c2.display();
cout << "c1 + c2 = ";
c3.display();
return 0;
}
重载运算符的规则
1、C++不允许用户自己定义新的的运算符,只能对已有的C++运算符进行重载。
2、C++不能进行重载的运算符有:.、*、::、sizeof和?:
3、重载不能改变运算符运算对象的个数。
4、重载不能改变运算符的优先级别
5、重载不能改变运算符的结合性。
6、重载运算符的函数不能有默认参数。
7、重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象
8、用于类对象的运算符一般必须重载,但有两个例外,运算符=和&不必用户重载。
9、从理论上说,可以将一个运算符重载为执行任意的操作,但为了更好理解程序,应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。
运算符重载函数作为类成员函数和友元函数
对运算符重载的函数有两种处理方式:
1、把运算符重载的函数作为类的成员函数;
2、运算符重载的函数不是类的成员函数,在类中把它声明为友元函数。
如果将运算符函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,因此可以少些一个函数的参数,但必须要求运算表达式中第一个参数是一个类对象,而且与运算符重载函数的类型相同。
将双目运算符重载为友元函数时,由于友元函数不是该类的成员函数,因此在函数的形参表列中必须有两个参数,不能省略,形参顺序任意。
重载双目运算符
双目运算符是C++中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,在重载双目运算符时,在函数中应有两个参数。
重载单目运算符
单目运算符只有一个操作数,重载单目运算符的方法与 重载双目运算符的方法时类似的。