跳转至

运算符重载

同一个符号有不同作用,运算符重载是C++里的高级功能。很多语言都没有运算符重载,例如java就不能,只能写一个普通的成员函数,C语言也没有运算符重载。

运算符重载就是一个函数。

image-20190812110741176

C++有四十多个运算符,绝大多数都可以重载,=赋值 <<流输出()函数调用 等等。

只有4个不可以重载。.* 对指针进行操作的运算符。

重载加号运算符

三个类,Dog,Cat,Person。

class Dog
{
public:
    int d;
};

class Cat
{
public:
    int c;
};

class Person
{
public:
    int p;
};

//运算符重载实际上就是一个函数
Cat operator+(const Person& p, const Dog& d)
{
    Cat cat;
    cat.c = p.p + d.d;
    return cat;
}

void testOperator()
{
    Dog d;
    Cat c;
    Person x;

    d.d = 100;
    x.p = 200;

    c = x + d;
    //也可以直接调用
    //c = x.operator+(d);

    cout << c.c << endl;
}

上面的运算符重载函数是个全局函数,也可以做成一个成员函数。

class Person
{
public:
    Cat operator+(const Dog& d)
    {
        Cat cat;
        cat.c = p + d.d;
        return cat;
    }
public:
    int p;
};

例:C++重载字符串加号运算符,拼接字符串。

例:

销售卖书,两个销售一共卖多少,每个销售卖的数量和卖了多少钱不一样。计算一共卖了多少本,一共卖了多少钱。

class Sale
{
    //友元函数 可以访问类中的私有成员
    friend Sale operator+(const Sale &left, const Sale &right);
public:

    /// 构造函数
    /// - Parameters:
    ///   - book: 什么书
    ///   - units: 卖多少本
    ///   - price: 卖多少钱
    Sale(const string &book, unsigned units, double price)
    : name(book),units_sold(units),revenue(units * price)
    {}


    /// 求平均每本多少钱
    double avg_price() const
    {
        return revenue / units_sold;
    }

//成员变量 为了调试,需要改成public
//private:
public:
    string name;
    unsigned units_sold;
    double revenue;
};

//运算符重载函数做成全局的函数
Sale operator+(const Sale &left, const Sale &right)
{
    Sale sale(left);
    sale.units_sold += right.units_sold;
    sale.revenue += right.revenue;
    return sale;
}

//调用
void test()
{
    Sale sale1("C++ Programming",10,50.0);
    Sale sale2("C++ Programming",2,60.0);
    Sale sale3 = sale1 + sale2;
    cout << sale3.units_sold << ", " << sale3.avg_price() << endl;
}

运算符重载函数做成 成员还是非成员函数

image-20190812165530209

很多时候,我们写的类不需要运算符重载,只是少数情况可能需求。当自己做的类需要哪个运算符就做哪一个。

函数的名称要加上operator

使用了运算符重载,为了使用起来方便。增强功能。