美文网首页
C++中的i++和++i

C++中的i++和++i

作者: nethanhan | 来源:发表于2017-10-14 10:48 被阅读0次

前置操作符和后置操作符

首先来思考一个问题:

    //下面的代码有没有区别?为什么?
    
    i++;  // i的值作为返回值,i 自增 1
    
    ++i;  // i自增 1, i 的值作为返回值

如果从原生语义上讲,不一样,但是是在单条语句内,运算结果都一样。并且如果在单条语句内,编译器会进行优化,有的是作为原生语义来进行编译,有的是直接作为同一意思来进行的。

  • 所以:
    • 现代编译器产品会对代码进行优化
    • 优化使得最终的二进制程序更加高效
    • 优化后的二进制程序丢失了C/C++的原生语义
    • 不可能从编译后的二进制程序还原C/C++程序

重载操作符


那这里再深入一下,讨论另外一个问题:

++ 操作符可以重载吗?
如何区分前置++ 和 后置++?

答案是可以重载的,不光是基本类型可以重载,类类型也可以重载。

  • ++操作符可以被重载
    • 全局函数和成员函数均可以进行重载
    • 重载前置 ++ 操作符不需要额外的参数
    • 重载后置 ++ 操作符需要一个 int 类型的占位参数

例如:

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int mValue;
public:
    Test(int i)
    {
        mValue = i;
    }
    
    int value()
    {
        return mValue;
    }
    
    // 重载前置 ++ 操作符,不需要参数
    Test& operator ++ ()
    {
        ++mValue;
        
        return *this;
    }
    
    //重载后置 ++操作符,需要一个int类型的参数
    Test operator ++ (int)
    {
        Test ret(mValue);
        
        mValue++;
        
        return ret;
    }
};

int main()
{
    Test t(0);
    
    //这里通过重载操作符,直接可以实现类类型的自加
    t++;
    
    ++t;
    
    return 0;
}

看完代码,其实也可以再次回答刚开始的问题了:

  • 区别:
    • 对于基础类型的变量
      • 前置 ++ 的效率与后置 ++ 的效率基本相同
      • 根据项目组编码规范进行选择
    • 对于类类型的对象
      • 后置 ++的重载函数中需要 新创建一个临时对象,随即又要销毁
      • 前置 ++的重载函数中不需要创建对象
      • 所以 前置 ++ 的效率高于后置 ++
      • 尽量使用前置 ++ 操作符提高程序效率

注意


看完 ++ 操作符的重载以后,其实也可以推出 -- 操作符和 ++ 操作符的重载规则是一样的,所有适用于 ++ 操作符的规则和特性也同样适用于 -- 操作符。

小结


  • 编译优化使得最终的可执行程序更加高效
  • 前置 ++ 操作符和后置 ++ 操作符都可以被重载
  • ++ 操作符的重载必须符合其原生语义
  • 对于基础类型,前置 ++ 与后置 ++ 的效率几乎相同
  • 对于类类型,前置 ++ 的效率高于后置 ++
  • ++ 操作符的重载规则和特性同样也适用于 -- 操作符

相关文章

  • C++中的i++和++i

    前置操作符和后置操作符 首先来思考一个问题: 如果从原生语义上讲,不一样,但是是在单条语句内,运算结果都一样。并且...

  • c++ 重载前置++和后置++

    前置++:即为++放在变量的左边,如++i;后置++:即为++放在变量的右边,如i++; 首先回顾c++中++i与...

  • Java中的i++ 和 ++i 在for循环使用

    Java的i++ 和++i 的区别i++:先赋值,后计算;++i;先计算,后赋值。 for循环中的i++和++i...

  • C++ i=i++陷阱

    发现一个C++ 特别有意思的事情int i = 10;i=i++;cout<

  • i++和++i的区别

    i++和++i有哪些区别? i++和++i都是实现变量i的自增,两者的区别在于i++是先运算,再加1,而++i是先...

  • js 中的i++与i++;

    以上的输出的结果是 0;再来看看这个

  • i++和++i

    i++ 先赋值后相加 //结果65 ++i 先自加后赋值 //结果66

  • ++i和i++

    ++i和i++ 如果是自身使用,没有任何区别。 使用后再进行赋值时有区别: 前加:先自身+1再把结果赋值给...

  • i++和++i

    java场景一 打印结果: i: 0 j: 1 java场景二 打印结果: i: 0 j: 1

  • ++i和i++

    1.a = i++; 等校为 a = i; i = i + 1; 2.a = ++i; 等校为 i = i ...

网友评论

      本文标题:C++中的i++和++i

      本文链接:https://www.haomeiwen.com/subject/uzjxuxtx.html