• 第40课.前置操作符和后置操作符


    前置操作符: ++i; --i;
    后置操作符: i++; i--;

    1.i++和++i和区别?

    下面的代码有没有区别?为什么?

    i++;
    ++i;    //注:与j = i++; 有区别
    

    在工程中,独立的这两行语句是完全一样的没有差异(从汇编代码去看)。原因是,编译器的优化,这样做更高效。

    对于基础类型的变量(未重载)

    a.两行语句是完全一样的没有差异(从汇编代码去看)
    b.前置++的效率与后置++的效率基本相同

    对于类类型的对象(重载)

    a.两者完全不一样
    b.前置++的效率高于后置++

    2.前者操作符和后置操作的重载

    a.全局函数和成员函数均可进行重载(推荐成员函数重载)
    b.重载前置(++, --)操作符不需要额外的参数
    c.重载后置(++, --)操作符需要一个int类型占位参数

    eg:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Test 
    {
        int mValue;
    public:
        Test(int i)
        {
            mValue = i;
        }
        
        int value ()
        {
            return mValue;
        }
    
        Test& operator ++ ()            // Test& 这里使用引用没有问题,因为这里返回的是主函数里定义的当前对象。它只会在主函数结束时才被释放
        {
            ++mValue;
            
            return *this;
        }
        
        Test operator ++ (int)          // Test 这里返回的是Test对象。是因为。这里定义了一个局部对象,我们需要返回的值存储在局部对象中。所以我们
                                        // 需要直接返回这个对象。而不能返回引用(引用的局部对象会在return的时候,被释放。这样引用就错误了)。
                                        // 如果这里返回this对象的话,就无法实现后置++的功能了
        {
            Test ret(mValue);
            
            mValue++;
            
            return ret;
        }
    };
    
    int main()
    {
        Test t(0);
        
        t++;            // 此时t++和下面的++t是不一样的。因为他们重载调用的函数不同
        cout << "t++ = " << t.value() << endl;
        
        ++t;            //
        cout << "++t = " << t.value() << endl;
        
        return 0;
    }
    

  • 相关阅读:
    【zookpeer】Failed to check the status of the service com.xxx.UserSerivce. No provider available for
    【solr】Spring data solr Document is missing mandatory uniqueKey field: id 解决
    【ssm】springmvc-spring-mybatis框架的搭建
    【jdbc】jdbc连接池理解
    【java基础】接口的理解
    【java基础】private protect的理解
    Single Number II
    Single Number I
    Candy
    Gas Station
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11916834.html
Copyright © 2020-2023  润新知