30、操作符重载的概念

#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;

}

通过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()
{
    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;

}

可以将操作符重载函数定义为类的成员函数

     比全局操作符重载函数少一个参数(左操作数,隐藏的this指针可以代替左操作数)。

    不需要依赖友元就可以完成操作符重载。

    编译器优先在成员函数中寻找操作符重载函数。

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()
{
    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/ws857707645/article/details/80218939