如何以两种不同的方式为operator + ++和前缀++ a重载operator ++?

roo*_*kie 106 c++ operator-overloading

如何以两种不同的方式为后缀a++和前缀重载operator ++ ++a

Mar*_*ork 164

应该是这样的:

class Number 
{
    public:
        Number& operator++ ()     // prefix ++
        {
           // Do work on this.   (increment your object here)
           return *this;
        }

        // You want to make the ++ operator work like the standard operators
        // The simple way to do this is to implement postfix in terms of prefix.
        //
        Number  operator++ (int)  // postfix ++
        {
           Number result(*this);   // make a copy for result
           ++(*this);              // Now use the prefix version to do the work
           return result;          // return the copy (the old) value.
        }
}; 
Run Code Online (Sandbox Code Playgroud)

  • @Eric:除了混合中间的句子外,你一直都是正确的.它的前缀更好. (21认同)
  • 此代码还显示前缀与后缀性能的差异.如果要返回的对象不适合CPU寄存器,那么您正在进行昂贵的复制操作.如果你需要使用预递增的值,这很好,但如果你不需要,postfix会好得多.一个例子是迭代器,你通常使用:for(pos = c.begin(); ...; ++ pos){}而不是pos ++ (15认同)
  • @SeanLetendre:它实际上并不采用int参数.这是一个假参数.但是C++语言的设计者必须定义一种区分前缀和后缀函数定义的方法.这是他们做出的设计决定. (9认同)
  • 为什么`Number operator ++(int)`将`int`作为参数,即使你不使用它? (6认同)
  • @EnricoMariaDeAngelis:语法将两者区分开。`++ x`是前缀,因此称为`operator ++()`,而`x ++`是后缀,因此称为`operator ++(int)` (2认同)

sta*_*ica 34

区别在于您为过载选择的签名operator ++.

引自C++常见问题中关于此主题的相关文章(去那里了解更多详情):

class Number {
  public:
    Number& operator++ ();     // prefix ++: no parameter, returns a reference
    Number  operator++ (int);  // postfix ++: dummy parameter, returns a value
};
Run Code Online (Sandbox Code Playgroud)

PS:当我发现这一点时,我最初看到的只是虚拟参数,但不同的返回类型实际上更有趣; 他们可能会解释为什么++x被认为比x++ 一般更有效.


pae*_*bal 17

您有两种方法可以为类型T重载两个(前缀/后缀)++运算符:

对象方法:

这是使用"常见"OOP习语的最简单方法.

class T
{
    public :
        T & operator++() // ++A
        {
            // Do increment of "this" value
            return *this ;
        }

        T operator++(int) // A++
        {
           T temp = *this ;
           // Do increment of "this" value
           return temp ;
        }
} ;
Run Code Online (Sandbox Code Playgroud)

对象非成员函数:

这是另一种方法:只要函数与它们引用的对象位于相同的命名空间中,当编译器搜索要处理++t ;t++ ;编码的函数时,将考虑它们:

class T
{
    // etc.
} ;


T & operator++(T & p_oRight) // ++A
{
   // Do increment of p_oRight value
   return p_oRight ;
}

T operator++(T & p_oRight, int) // A++
{
   T oCopy ;
   // Copy p_oRight into oCopy
   // Do increment of p_oRight value
   return oCopy ;
}
Run Code Online (Sandbox Code Playgroud)

重要的是要记住,从C++的角度来看(包括C++编译器的观点),那些非成员函数仍然是T接口的一部分(只要它们在同一名称空间中).

非成员函数表示法有两个潜在的优点:

  • 如果你设法对它们进行编码而不使它们成为T的朋友,那么你增加了T的封装
  • 您甚至可以将其应用于您不拥有其代码的类或结构.这是一种非侵入性的方法来增强对象的接口而不修改其声明.