C++(三十五) — 运算符重载

     运算符重载的实质:函数重载。除了增加一个关键字 operator 外,与函数重载没有区别,都是通过该类的某个对象来访问重载运算符。

 (1)重载运算符时,运算符运算顺序和优先级不变操作数个数不变

 (2)不能创造新的运算符;

 (3)形式:重载为类的成员函数。对象本身就是其中的一个操作数,所以形参表内参数的数目比操作数的数目少一个

                     重载为类的友元函数。一元运算符有一个形参;二元运算符有两个形参;每个形参代表运算符的一个操作数。

 1、友元函数和成员函数的应用举例,一般情况下应用成员函数。

#include <iostream>
using namespace std;

class Complex
{
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    void printCom()
    {
        cout << a << " + " << b << "i" << endl;
    }
public:
    // 友元函数实现,必须和实现的完全一样
    friend Complex operator+(Complex &c1, Complex &c2);
    friend Complex& operator++(Complex &c1);
    friend Complex operator++(Complex &c1, int);
    friend ostream& operator<<(ostream &out, Complex &c1);
    //friend void operator<<(ostream &out, Complex &c1);

    //成员函数法实现 - 号运算符重载
    Complex operator-(Complex &c2)
    {
        Complex tmp(a - c2.a, b - c2.b);
        return tmp;
    }
    //成员函数实现 前置-- 操作
    Complex& operator--()
    {
        a--; b--;
        return *this;
    }
    //成员函数实现 后置-- 操作,与 前置-- 使用占位符进行区别。
    Complex operator--(int)
    {
        Complex tmp = *this;
        a--; b--;
        return tmp;
    }
private:
    int a, b;
};

//友元函数实现 + 号运算符重载
Complex operator+(Complex &c1, Complex &c2)
{
    Complex tmp(c1.a + c2.a, c1.b + c2.b);
    return tmp;
}
// 友元函数实现 一元运算符 重载,前置++
Complex& operator++(Complex &c1)
{
    c1.a++;
    c1.b++;
    return c1;
}
// 友元函数实现  一元运算符 重载,后置++
Complex operator++(Complex &c1, int)
{
    Complex tmp = c1;
    c1.a++;
    c1.b++;
    return tmp;
}

void main()
{
    Complex c1(1, 2), c2(3, 4);
    //1、全局函数实现,对于私有成员使用了友元函数。
    Complex c3 = c1 + c2;
    c3.printCom();
    //2、成员函数实现
    Complex c4 = c1 - c2;
    c4.printCom();

    //3、全局函数实现,前置++
    ++c1;
    c1.printCom();
    //4、成员函数实现,前置--
    --c1;
    c1.printCom();

    //5、全局函数实现,后置++
    Complex c5 = c1++;
    c5.printCom();
    c1.printCom();
    //6、成员函数实现,后置--
    Complex c6 = c1--;
    c6.printCom();
    c1.printCom();

    system("pause");
}

2、友元函数的应用场景,左移右移操作符的重载。

//只能使用友元函数实现左移、右移操作运算符
/*oid operator<<(ostream &out, Complex &c1)
{
    out << c1.a << " + " << c1.b << "i" << endl;
}*/
//只能使用友元函数实现左移、右移操作运算符
ostream& operator<<(ostream &out, Complex &c1)
{
    out << c1.a << " + " << c1.b << "i" << endl;
    return out;
}

void main()
{
        int a = 10;
    Complex c1(1, 2), c2(3, 4);
    //cout << c1;
    cout << c1 << "abv" << endl;
       system("pause");
}

 

posted @ 2019-05-23 19:02  深度机器学习  阅读(414)  评论(0编辑  收藏  举报