如何重载运算符++以两种不同的方式为后缀a ++和前缀++ a?

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

应该是这样的:

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

区别在于您为operator ++超载select了什么签名。

从C ++常见问题的相关文章中引用此主题 (请访问以获取更多详细信息):

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

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

你有两种方法来重载一个types为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 ; } } ; 

对象非成员函数:

这是另一种方法:只要函数和它们引用的对象在同一个命名空间中,当编译器将search一个++t ;来处理++t ;时,它们将被考虑++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 ; } 

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

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

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

声明如下:

 class A { public: A& operator++(); //Prefix (++a) A operator++(int); //Postfix (a++) }; 

正确实施 – 不要混淆大家都知道他们做的事情(增加然后使用,然后增量)。

我想借助一个例子来解释它

 struct data { int i; }; data operator ++(data x)// pre increment { data t; xi=x.i+1; ti=xi; return t; } data operator ++ (data x, int ) // post increment ( A dummy int has been passed) { data t; ti=xi; xi =x.i+1; return t; } void main () { data i={12}, a; a=i++; a=++i; }