复数计算第一种形式 (自定义复数类):
- #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 Add(const Complex& p1, const Complex& p2);
- };
- Complex Add(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 = Add(c1, c2); // c1 + c2
- printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
- return 0;
- }
- Question:
Add 函数可以解决 Complex 对象相加的问题;
但是 Complex 是现实世界的确定存在的复数;
并且复数的地位在数学中的地位与普通的实数地位 i 相同;
为什么不能 + 操作符也支持复数相加呢?
操作符重载:
C++ 中的 operator 关键字可以定义特殊的函数
operator 的本质是通过函数重载操作符;
- #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;
- }
操作符重载的本质就是函数重载.
那还有什么深度挖掘的地方呢? 上面的例子我们使用了友元, 而友元是我们尽量避免的, 那我们可以怎样修改呢?
- 可以将操作符重载函数定义为类中的 成员函数.
- 比全局操作符重载函数少一个参数 (左操作数)
- 不需要依赖友元就可以完成操作符重载;
- 编译器优先在成员函数中寻找操作符操作函数;
实例代码分析 3:
- #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;
- printf("Complex operator + (const Complex& p)\n");
- ret.a = this->a + p.a;
- ret.b = this->b + p.b;
- return ret;
- }
- friend Complex operator + (const Complex& p1, const Complex& p2);
- };
- Complex operator + (const Complex& p1, const Complex& p2)
- {
- Complex ret;
- printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
- 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;
- }
小结:
操作符重载是 C++ 的强大特性之一;
操作符重载的本质是通过函数扩展操作符的功能;
operator 关键字是实现操作符重载的关键
操作符重载遵循相同的函数重载规则
全局函数和成员函数都可以实现对操作符的重载.
来源: http://www.bubuko.com/infodetail-2883765.html