参考书籍:面向对象程序设计(c++)
- 运算符重载的规则
- 运算符重载为友元函数
- 运算符重载为成员函数
- 几种常用的运算符重载
当编译器无法完成一些我们想要实现的功能的时候,例如(坐标之间的相加),这时候我们就需要自己去定义运算符。
运算符重载的规则
运算符重载的格式
重载运算符函数的一般格式为:
T operator +(int a,int b)
{
return a+b;
}
T为返回类型,operator为关键字,@为运算符名称,参数表为参数运算的数据即操作数,可以是一个或者两个,分别对应单目运算符和双目运算符
运算符函数的参数建议都声明为引用型,可以最大程度地提高运行效率,如果不希望在函数内部对参数有所改动,可以在参数前加const关键字加以限定
运算符重载需要遵守的规则
c++中有5个运算符不能重载:
- 成员访问运算符 : .
- 成员指针运算符:.*
- 域操作运算符:::
- 条件运算符:?:
- 空间计算运算符:sizeof
运算符重载应该符合实际需要,重载的功能应该域运算符原有的功能类似
运算符重载为友元函数
声明的一般形式为:
friend 返回类型 operator @(参数表);
而函数的具体定义如下:
返回类型 operator @(参数表)
{
//函数体
}
返回类型通常与它所操作的类的类型相同,参数的类型通常也与它所操作的类的类型相同,声明成友元函数的原因主要是可以提高执行效率
下面是Complex类的友元函数运算符重载
class Complex{
private:
double image;
double real;
public:
Complex(double x = 0.0,double y = 0.0)
{
real = x;
image = y;
}
void Print()
{
cout << real << "+" << image << "i" << endl;
}
friend Complex operator +(const Complex& c1, const Complex& c2);
};
Complex operator +(const Complex& c1, const Complex& c2)
{
Complex temp(c1.real + c2.real, c1.image + c2.image);
return temp;
}
由上面的坐标相加的例子我们可以知道几个细节:
1.由于友元函数的返回类型是Complex,所以临时变量temp也必须是Complex型(如果你要想简单点,直接return Complex(c1.real + c2.real, c1.image + c2.image);也行)
2.此例中无需修改c1和c2的值,所以这里用到了const修饰
运算符重载为成员函数
由于友元函数与类配合的情况降低了该类的独立性,破坏了该类的封装特性。因此在一般情况下,应将类所涉及的所有操作都定义在类中,即应将类的运算符重载成类中的成元函数。注意:如果是重载双目运算符,就只要设置一个参数作为右侧运算量,而左侧运算符就是该对象本身;如果是重载单目运算符,就不必另外设置参数,运算符的操作量就是对象本身
下面仍以Complex类为例,包括成元函数的方式重载减法”-“和相等比较符”==“,以及求负反符号”-“
class Complex{
private:
double image;
double real;
public:
Complex(double x = 0.0,double y = 0.0)
{
real = x;
image = y;
}
void Print()
{
cout << real << "+" << image << "i" << endl;
}
Complex operator -(const Complex& c);
Complex operator -();
bool operator ==(const Complex& c);
Complex &operator +=(const Complex& c);
};
Complex Complex ::operator -(const Complex& c)
{
Complex temp(real - c.real, real - c.image);
return temp;
}
bool Complex ::operator ==(const Complex& c) //此函数为判断,所以是bool类型的
{
return (real == c.real && image == c.image);
}
Complex Complex::operator-()
{
return (-real, -image);
}
Complex& Complex::operator +=(const Complex& c) //对自身的值需要修改,所以要加上&
{
real += c.real;
image += c.image;
return *this; //返回对象本身的引用