重载前置,后置(自增运算符 ++ 和自减运算符 --)

    xiaoxiao2025-10-08  6

    转载自:http://blog.csdn.net/anye3000/article/details/6618495

    如何重载增量运算符 ++ 和 --

    运算符++和--有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。

    对于“++” 和“--”这两个一元运算符,存在前置和后置的问题,在定义时必须有所区分。 (1) 用成员函数的形式来进行重载 如果++为前增量运算符时,重载函数的一般格式为: < type > ClassName :: operator ++ ( ) { //… }

    如果++为后增量运算符时,重载函数的一般格式为: < type > ClassName :: operator ++ ( int ) { //… }

    (2) 非成员函数形式的重载 以++ 为例说明 用友元函数来实现“++”运算符的重载时,前置++运算符的重载的一般格式: friend <type> operator ++ (ClassName & ); 其中,第一个参数是要实现++运算的对象。

    后置++运算符的重载的一般格式: friend <type> operator ++(ClassName &,int); 其中,第一个参数是要实现++运算的对象;而第二个参数除了用于区分是后置运算外,并没有其他意义,故起参数可有可无.

    -------------------------------------------------------

    [cpp] view plain copy #include <iostream>   #include "assert.h"   class A   {   public:       A(int i)           :m_i(i)       {       }       // ++i       A& operator++()       {           ++m_i;           return *this;       }       // i++       const A operator++(int)       {           A tmp = *this;           ++(*this);    // Implemented by prefix increment           return A(tmp);       }       int m_i;   };   int main()   {       int i = 0;       int i1 = i++;   // i1 = 0; i = 1;       int i2 = ++i;   // i2 = 2; i = 1;       A a(0);       A a1 = a++;     // i1 = 0; i = 1;       A a2 = ++a;     // i2 = 2; i = 1;          //a++++; //avoid       //++++a; //support       assert(i1 == a1.m_i);       assert(i2 == a2.m_i);       return 0;   }   说明

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

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

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

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

    转载请注明原文地址: https://ju.6miu.com/read-1302939.html
    最新回复(0)