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;
    }
    

  • 相关阅读:
    我们在囧途之程序员转型记
    项目开发应遵循1+7还是7+1?
    自己用的一款模板解析程序(支持插件和扩展)(思路讨论和使用体验)
    设计的核心任务之一:层次的控制
    【设计 = 编码】 VS 【设计 ≠ 编码】
    从一生的角度看程序员的学习和发展
    编码质量与命名
    软件开发十年小史
    设计的核心任务之三:确保正交性
    国内外软件开发上的差距与分析
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11916834.html
Copyright © 2011-2022 走看看