美文网首页
2019-07-11 运算符的重载

2019-07-11 运算符的重载

作者: 知成 | 来源:发表于2019-07-11 18:03 被阅读0次

    运算符的重载


    重载运算符

    • (“::”,“.*”,“.”,“?:”)不能被重载。
    • 重载运算符时,不能改变其本质,如不能将“+”的求和运算重载为作差运算等。
    • 优先级与结合律要与内置运算符保持一致。
    • 若重载的运算符是成员函数时,this绑定到运算符的左侧对象。成员运算符的显式参数比运算对象总少一个。

    note:

    • 当把运算符定义为成员函数时,其左侧必须是运算符所属类型的一个对象。
    • 下标运算符(“[]”)需要定义为成员函数。
    • (“++”“--”)分为可分为前置版与后置版,为了区分前置与后置,我们在定义后置版时,加入一个int类型的形参加以区分(内置为0)。“int”的唯一作用就是用来做区分用的。
      eg1:
    string s = "word";
    string t = s + "!";//等价于s.operator("!");
    string u = "hi" + s;//等价于hi.operator(s)因此“<<”不能定义为成员函数
    

    eg2:以复数的运算为例,我并未曾将所有的形式写完整,但是主体形式以经成型,剩下的基本用Ctrl+CV就能解决

    #include<iostream>
    using namespace std;
    class Cplural 
    {
    public:
        void SetPlural(int a,int b);
        void GetPlural();
        //重载输入输出运算符
        friend ostream &operator <<(ostream &os, const Cplural &plural);
        friend istream &operator >> (istream  &is, Cplural &plural);
        //重载算术运算符 在此以+为例,— * / %等同理
        //在此使用非成员函数形式
        friend Cplural &operator+(const Cplural &plural1, const Cplural &plural2);
        //== !=的重载
        friend bool operator ==(const Cplural &plural1, const Cplural &plural2);
        friend bool operator !=(const Cplural &plural1, const Cplural &plural2);
        //递增 递减运算符的重载 在此仅以递增为例
        Cplural &operator++();
        Cplural &operator++(int);
    
    
    
    private:
        int a;  //实部
        int b;  //虚部
    };
    
    void Cplural::SetPlural(int a,int b)
    {
        this->a = a;
        this->b = b;
    }
    
    void Cplural::GetPlural()
    {
        
    }
    
    Cplural & Cplural::operator++()
    {
        // TODO: 在此处插入 return 语句
        ++this->a;
        ++this->b;
        return *this;
    }
    
    Cplural & Cplural::operator++(int)
    {
        // TODO: 在此处插入 return 语句
        this->a++;
        this->b++;
        return *this;
    }
    
    ostream & operator<<(ostream & os, const Cplural & plural)
    {
        // TODO: 在此处插入 return 语句
        os << plural.a << " + " << plural.b << "i";
        return os;
    }
    
    istream & operator >> (istream & is, Cplural & plural)
    {
        // TODO: 在此处插入 return 语句
        is >> plural.a >> plural.b;
        if (!is)
        {
            plural.a = 0;
            plural.b = 0;
        }
        return is;
    }
    
    Cplural & operator+(const Cplural & plural1, const Cplural & plural2)
    {
        // TODO: 在此处插入 return 语句
        Cplural temp;
        temp.a = plural1.a + plural2.a;
        temp.b = plural1.b + plural2.b;
        return temp;
    }
    
    bool operator==(const Cplural & plural1, const Cplural & plural2)
    {
        // TODO: 在此处插入 return 语句
        if (plural1.a == plural2.a && plural1.b == plural2.b)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool operator!=(const Cplural & plural1, const Cplural & plural2)
    {
        // TODO: 在此处插入 return 语句
        if (plural1.a != plural2.a && plural1.b != plural2.b)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    int main()
    {
        Cplural a1,a2,a3;
        a1.SetPlural(5, 6);
        a2.SetPlural(3, 4);
        a3.SetPlural(3, 4);
        /*a1++;
        ++a2;*/
        cout << a1++ << "   " << ++a2;
        getchar();
        getchar();
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:2019-07-11 运算符的重载

          本文链接:https://www.haomeiwen.com/subject/iitjkctx.html