zoukankan      html  css  js  c++  java
  • 第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;
    }
    

  • 相关阅读:
    cocos2d JS-(JavaScript) 冒泡排序
    JavaScript实现字符串逆置的几种方法
    JavaScript 常用数组函数方法专题
    Cocos Creator 资源加载(笔记)
    cocos中FPS数值的含义
    Cocos Creator cc.Event点击触摸事件详解
    Cocos Creator 鼠标事件
    Cocos Creator 触摸点击事件
    Cocos Creator 键盘监听事件
    JavaScript 基础数组循环和迭代的几种方法
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11916834.html
Copyright © 2011-2022 走看看