zoukankan      html  css  js  c++  java
  • 【C++】C++中的操作符重载

    C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下。

    操作符重载的一般语法

    重载方式分为两种,一种是重载为类的成员函数,另一种重载为类的友元函数,其语法形式分别为:

    // 方式一:重载为成员函数
    class MyClass
    {
    public:
        返回类型 operator 操作符(形参列表);
    };
    
    返回类型 MyClass::operator 操作符(形参列表)
    {
        // 函数体
    }
    
    
    // 方式二:重载为友元函数
    class MyClass
    {
    public:
        friend 返回类型 operator 操作符(形参列表);
    };
    
    返回类型 operator 操作符(形参列表)
    {
        // 函数体
    }

    操作符重载的三条基本原则

    1. 如果操作符的含义并不显而易见或者有可能存在争议,不应该重载该操作符。考虑提供一个函数代替该操作符重载。
    2. 总是坚持操作符固有的语义。比如,如果将+操作符重载表示的语义a-b,编译器能够顺利通过,但是与操作符使用者的预期严重不符。
    3. 总是提供所有相关的操作符。比如,如果支持了a+b,使用者当然期望能够调用a+=b;如果支持前缀自增++a,同时提供后缀自增a--。如果提供了a<b,请提供a>b。

    成员函数与非成员函数(友元函数)的选择

    赋值操作符(=), 取下标操作符([]), 成员访问操作符(->)和函数调用操作符( () )必须重载为成员函数。

    1. 如果是一元操作符,实现为成员函数
    2. 如果是二元操作符,并且该二元操作符视左右操作数为平等的(例如:算数操作符,关系操作符和位操作符等),实现为非成员函数
    3. 如果是二元操作符,并且视左右操作数不平等,那么实现为成员函数(例如:+=,-=,*=, /=等)

    常见的操作符重载

    说了那么多,最重要的就是常见操作符的语法形式,如下:

    #include <iostream>
    #include <string>
    using namespace std;
    class ClassType;
    
    // 输入输出操作符(必须为非成员函数)
    ostream& operator<< (ostream& os, const ClassType& object) {return os;}
    istream& operator>> (istream& is,       ClassType& object) {return is;} // 注意object对象是非const引用
    
    //赋值操作符(必须为成员函数)
    ClassType& operator=  (const ClassType& object) {return *this;}
    ClassType& operator-= (const ClassType& object) {return *this;} 
    ClassType& operator*= (const ClassType& object) {return *this;}
    ClassType& operator/= (const ClassType& object) {return *this;}
    ClassType& operator%= (const ClassType& object) {return *this;}
    
    // 算术操作符(一般定义为非成员函数)
    ClassType operator+    (const ClassType& lhs, const ClassType& rhs);
    ClassType operator-    (const ClassType& lhs, const ClassType& rhs);
    ClassType operator*    (const ClassType& lhs, const ClassType& rhs);
    ClassType operator/    (const ClassType& lhs, const ClassType& rhs);
    ClassType operator% (const ClassType& lhs, const ClassType& rhs);
    
    // 关系操作符(一般定义为非成员函数)
    inline bool operator<     (const ClassType& lhs, const ClassType& rhs);
    inline bool operator<=    (const ClassType& lhs, const ClassType& rhs);
    inline bool operator>     (const ClassType& lhs, const ClassType& rhs);
    inline bool operator>=    (const ClassType& lhs, const ClassType& rhs);
    inline bool operator==    (const ClassType& lhs, const ClassType& rhs);
    inline bool operator!=    (const ClassType& lhs, const ClassType& rhs);
    
    // 自增和自减操作符(一般作为成员函数)
    ClassType& operator++ () {return *this;}        // 前缀++,例如:++iter
    ClassType& operator-- () {return *this;}
    ClassType operator++ (int) {return tmp;}        // 后缀++,例如:iter++
    ClassType operator-- (int) {return tmp;}
    
    // 下标操作符(必须定义为成员函数)
          TypeInContainer& operator[] (const size_t index)            // 非const版本
    const TypeInContainer& operator[] (const size_t index) const      // const 版本
    
    // 成员访问操作符(*,-> 定义成员函数)
    Class MyPtr
    {
              value_type& operator*();            //非const版本
        const value_type& operator*() const;      //const版本
              value_type* operator->();
        const value_type* operator->() const;
    };
    
    // 函数调用操作符
    struct MyClass
    {
        ClassType operator()(Type1 x1, Type2 x2)
        {
    
        }
    };

     参考文献:

  • 相关阅读:
    HISI MPP模块 AO 和 ADEC 参数配置(转)
    HISI H264/H265 P帧帧内刷新功能,降低I帧太大带来的网络冲击(转)
    LiteOS系统--快速烧写.bin文件到norflash相应位置(转)
    海思平台(hi3559av100)的pq_sample代码编译过程和执行过程(转)
    MySQL主从同步配置
    WebLogic
    为什么公司用weblogic而不用tomcat?
    查看和更改rpm的默认安装路径的方法
    VM options 以及 properties文件的一些理解
    Could not transfer artifact xxx from/to xxx解决方案
  • 原文地址:https://www.cnblogs.com/python27/p/3655949.html
Copyright © 2011-2022 走看看