• C++重载自增运算符的效率问题


    C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。

    increment的前缀形式表示“增加然后取回”,后缀形式表示“取回然后增加”。

     1     #include "stdafx.h"
     2     #include "assert.h"
     3     class A
     4     {
     5     public:
     6         A(int i)
     7             :m_i(i)
     8         {
     9         }
    10         // ++i
    11         A& operator++()
    12         {
    13             ++m_i;
    14             return *this;
    15         }
    16         // i++
    17         const A operator++(int)
    18         {
    19             A tmp = *this;
    20             ++(*this);    // Implemented by prefix increment
    21             return A(tmp);
    22         }
    23         int m_i;
    24     };
    25     int _tmain(int argc, _TCHAR* argv[])
    26     {
    27         int i = 0;
    28         int i1 = i++;   // i1 = 0; i = 1;
    29         int i2 = ++i;   // i2 = 2; i = 1;
    30         A a(0);
    31         A a1 = a++;     // i1 = 0; i = 1;
    32         A a2 = ++a;     // i2 = 2; i = 1;
    33         
    34         //a++++; //avoid
    35         //++++a; //support
    36         assert(i1 == a1.m_i);
    37         assert(i2 == a2.m_i);
    38         return 0;
    39     }

    说明

    1. 类中的++操作符号重载之后必须保证其语意与全局++相同。

    2.为了区分前后,用++()表示前自增,用++(int)后自增。

    3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
    4.后自增应该返回"const Complex".这可以防止形如"a++++"的用法。

    5.一般通过前自增操作来实现后自增操作符函数。

    从上面可以看出,后置运算需要复制一个无用的临时对象,效率肯定是要低一点的。

  • 相关阅读:
    CMake基本语法
    Immutable使用与react+redux
    mysql 安装之docker
    elasticsearch 安装之docker 单机
    局域网共享时提示:你没有权限访问,请与网络管理员联系
    【python、Neo4j】 python3.6环境安装neo4j客户端
    【python】 Anaconda jupyter 服务正常,内核启动失败, ipython启动失败
    Neo4j 手动安装apoc插件
    Ubuntu16 安装配置Neo4j
    node工具之nodemon
  • 原文地址:https://www.cnblogs.com/cane/p/3914653.html
Copyright © 2020-2023  润新知