操作符重载的概念
操作符的重载
1、C++中的重载能够扩展操作符的功能;
2、操作符的重载以函数的方式进行;
3、本质:用特殊形式的函数扩展操作符的功能。
4、通过operator关键字可以定义特殊的函数;
5、operator的本质是通过函数重载操作符;
6、语法:
Type operator Sign(const Type p1, const Type p2)
{
Type ret;
return ret;
}
其中Sign为系统中预定义的操作符,如:+、-、*、/、等。
例题分析:
#include <stdio.h>
class Complex
{
int a;
int b;
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
int getA()
{
return a;
}
int getB()
{
return b;
}
friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret;
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b;
return ret;
}
int main()
{
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2; // 等价于 operator(c1, c2)
printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
return 0;
}
可以将操作符重载函数定义为类的成员函数
1、比全局操作符重载函数少一个参数(左操作数)
2、不需要依赖有元就可以完成操作符重载
3、编译器优先在成员函数中寻找操作符重载函数。
class Type
{
public:
Type operator Sign(const Type& p)
{
Type ret;
return ret;
}
};
例题分析:
#include <stdio.h>
class Complex
{
int a;
int b;
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
int getA()
{
return a;
}
int getB()
{
return b;
}
Complex operator + (const Complex& p)
{
Complex ret;
ret.a = this->a + p.a;
ret.b = this->b + p.b;
printf("Complex operator + (const Complex& p):\n");
return ret;
}
friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret;
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b;
return ret;
}
int main()
{
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2; // 等价于 c1.operator + (c2)
printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
return 0;
}
结论:编译器优先在成员函数中寻找操作符重载函数。
小结
1、操作符重载是C++的强大特性之一;
2、操作符重载的本质是通过函数的扩展操作符的功能;
3、operator关键字是实现操作符重载的关键;
4、操作符重载遵循相同的函数重载规则;
5、全局函数和成员函数都可以实现对操作符的重载。
注意事项
1、C++规定赋值操作符(=)只能重载为成员函数;
2、操作符重载不能改变原操作符的优先级;
3、操作符重载不能改变操作数的个数;
4、操作符重载不应改变操作符的原本的语义;
5、操作符重载的本质为函数定义。