30-操作符重载的概念

30-操作符重载的概念

  • C++中的重载能够扩展操作符的功能
  • 操作符的重载以函数的方式进行
  • 本质:用特殊形式的函数扩展操作符的功能
  • 通过operator关键字可以定义特殊的函数
  • operator的本质是通过函数重载操作符
  • 语法:
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(int argc, const char* argv[]) {
    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;
}
可以将操作符重载函数定义为类的成员函数:
  • 比全局操作符重载函数少一个参数(左操作数)
  • 不需要依赖友元就可以完成操作符重载
  • 编译器优先在成员函数中寻找操作符重载函数
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;
        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(int argc, const char* argv[]) {
    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;
}

猜你喜欢

转载自blog.csdn.net/qq_19247455/article/details/80061637
今日推荐