• 前置后置运算符重载


    前置和后置自增

    自己实现int类型 MyInteger

    内部维护以int数据

    MyInteger myInt

    myInt ++ 后置  ++myInt  前置

    重载++运算符 operator++() 前置   operator++(int) 后置

    前置理念 先++ 后返回自身   后置理念 先保存住原有值  内部++ 返回临时数据

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    class MyInteger
    {
    public:
        MyInteger()
        {
            this->m_Num = 0;
        }
        //前置++重载
        MyInteger& operator++()
        {
            this->m_Num++;
            return *this;
        }
        //后置++ 重载
        MyInteger operator++(int)
        {
            //先保存目前数据
            MyInteger tmp = *this;
            this->m_Num++;
            return tmp;
        }
        int m_Num;
    };
    ostream& operator<<(ostream& cout, MyInteger& myInt)
    {
        cout << myInt.m_Num;
        return cout;
    }
    
    void test()
    {
        MyInteger myint;
        cout << ++myint << endl;        //前置++
        //myint++; //myint++可以执行
        cout << myint++ << endl;        //后置++   VS2019报错 找不到匹配的<<运算符
    }
    
    int main()
    {
        test();
        system("Pause");
        return 0;
    }

     所以,调用代码时候,要优先使用前缀形式,除非确实需要后缀形式返回的原值,前缀和后缀形式语义上是等价的,输入工作量也相当,只是效率经常会略高一些,由于前缀形式少创建了一个临时对象。

    补充:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    class MyInteger
    {
    public:
        MyInteger()
        {
            this->m_Num = 0;
        }
        //前置++重载
        MyInteger& operator++()             //前置返回的是引用 是对象本身
        {
            this->m_Num++;
            return *this;
        }
        //后置++ 重载
        MyInteger operator++(int)           //后置返回的是值,拷贝的对象本身的值 即返回的是临时数据
        {
            //先保存目前数据
            MyInteger tmp = *this;
            this->m_Num++;
            return tmp;
        }
        int m_Num;
    };
    ostream& operator<<(ostream& cout, MyInteger& myInt)
    {
        cout << myInt.m_Num;
        return cout;
    }
    
    void test()
    {
        MyInteger myint;
        //cout << ++myint << endl;        //前置++
        //myint++; //myint++可以执行
        //cout << myint++ << endl;        //后置++   VS2019报错 找不到匹配的<<运算符
    
        cout << ++(++myint) << endl;    //第一次++myint返回值为1 ++1 即为2 但如果前置重载返回的是值不是引用,那么此时的m_Num是1,而不是2
                                        //只有当前置返回的是对象本身,即是引用的话 m_Num的值才真为2
    
    }
    
    int main()
    {
        test();
        system("Pause");
        return 0;
    }
  • 相关阅读:
    Android学习笔记04-Activity及Activity生命周期
    Android学习笔记03-学习过程中碰到的一些问题及解决方法
    Android学习笔记--生命周期
    Android学习笔记01
    Android学习笔记--项目框架介绍
    Android学习笔记- Animation动画
    Android学习笔记02-AndroidManifest.xml文件解析
    cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded 解决方法
    jvm 03-java堆内存模型
    jvm 02-java对象访问模式
  • 原文地址:https://www.cnblogs.com/yifengs/p/15174768.html
Copyright © 2020-2023  润新知