zoukankan      html  css  js  c++  java
  • C++一些注意点之操作符重载

    重载操作符需要注意

    (1)重载操作符必须具有一个类类型操作数。不能重载内建类型的操作符。

    operator +(int,int);//这个是错误的,都为内建类型
    operator +(int,classType);//可以改成这样,保证有一个自定义类型

    (2)重载操作符可以定义为普通非成员函数或者类的成员函数。当定义为类的成员函数,默认含有一个this指针,作为一个参数;当定义非成员函数时,通常必须将它们设置为所操作类的友元。

    (3)调用重载操作符有两种方式:隐式调用,显示调用。

    cout<<item1+item2<<endl;//隐式调用重载操作符
    cout<<operator +(item1,item2);//非成员函数的重载操作符,显示调用
    cout<<item1.operator +( item2);//成员函数的重载操作符,显示调用

    重载操作符的几条准则

    (1)重载操作符时定义时,按照常规的习惯去重载。例如“==”可以被重载为测试两个对象是否相等;

    (2)如果一个类有算术操作符或位操作符重载,那应该提供相应的符合赋值操作符重载。

    (3)将要用关联容器键类型的类定义“<”操作符重载。因为关联容器默认使用键类型的<操作符。即使该类型将只存在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。例如sort使用”<”,find使用“==”。如果类定义了”==”操作符,也应该定义“!=”操作符。类定义了”<”,也可能会定义“>,>=,<=,<”。

    (4)如何选择成员函数还是普通函数:赋值(=)、下标[]、调用()、成员访问箭头->、复合赋值、++、--等定义为类的成员;对称的操作符、比较操作符最好定义为普通函数(类的友元函数)。

     

    几个常用的重载方式

    (1)输入和输出操作符

    friend ostream& operator<<(ostream& out,const classType& obj);
    template<class T>
    friend ostream& operator<<<T>(ostream& out,const classType<T>& obj);
     
    friend istream& operator<<(istream& in, classType& obj);
    template<class T>
    friend istream& operator<<<T>(istream& in, classType<T>& obj);

    (2)算术操作符和关系操作符重载

    friend classType operator +(constclassType&op1,const classType &op2);

    (3)赋值操作符重载

          类赋值操作符接受类类型形参,通常该形参是对类类型的const引用,但也可以是非const类型的引用。如果没有定义这个操作符,则编译器将合成它类赋值操作符必须是类的成员,以便编译器指定是否需要合成一个。可以为一个类定义许多附加的赋值操作符。赋值必须返回对*this的引用。

    string& operator=(const string&);
    string& operator=(const char*);
    string& operator=(char);

    (4)下标操作符重载

          下标操作符出现在左边必须生成左值,可以指定引用作为返回类型而得到左值。只要下标操作符返回引用,就可以作赋值的任意一方。可以对const和非const对象使用下标也是个好主意。应用const对象时,返回值为const引用,因此不能作为赋值目标。

    int& operator[](const size_t index)
    {return data[index];}
    const int& operator[](const size_tindex) const
    {return data[index];}

    (5)成员访问操作符重载

          箭头操作符必须定义为类的成员函数,解引用操作符不要求定义为成员。解引用和箭头操作符在实现智能指针的类中。

    class screen{
    public:
        screen& operator*(){return *ptr->sp;}
        screen* operator->(){return ptr->sp;}
        const screen& operator*()const
        {return *ptr->sp;}
        const screen* operator->()const
        {return ptr->sp;}
    private:
        scrPtr *ptr;
    };

          重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类对象。若返回类型为指针,则直接用该指针。若返回为定义了箭头操作符的对象,调用箭头操作符则递归调用返回对象的箭头操作符,如果返回对象没有定义箭头操作符,编译器将报错。


    (6)++操作符重载

    classType& operator++();//前缀式
    classType& operator++(int);//后缀式
    classType& operator++(int)
    {
        classType ret(*this);
        ++*this;//调用前缀式
        return ret;
    }
    classType obj;
    obj.operator++();//显示调用前缀式
    obj.operator++(0);//显示调用后缀式
     


  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3230821.html
Copyright © 2011-2022 走看看