[英]How to overload the operator++ in two different ways for postfix a++ and prefix ++a?
如何以两种不同的方式为后缀a++
和前缀++a
重载运算符++?
Should look like this:应该是这样的:
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.
}
};
The difference lies in what signature you choose for your overload(s) of operator ++
.不同之处在于您为
operator ++
重载选择了什么签名。
Cited from the relevant article on this subject in the C++ FAQ (go there for more details):从C++ FAQ 中关于这个主题的相关文章中引用(去那里了解更多细节):
class Number { public: Number& operator++ (); // prefix ++: no parameter, returns a reference Number operator++ (int); // postfix ++: dummy parameter, returns a value };
PS: When I found out about this, all I saw initially was the dummy parameter, but the different return types are actually more interesting; PS:当我发现这个时,我最初看到的只是虚拟参数,但不同的返回类型实际上更有趣; they might explain why
++x
is considered more efficient than x++
in general .他们或许可以解释为什么
++x
被认为比更高效的x++
一般。
You have two ways to overload the two (prefix/postfix) ++ operators for a type T:您有两种方法可以为类型 T 重载两个(前缀/后缀)++ 运算符:
This is the easiest way, using "common" OOP idiom.这是最简单的方法,使用“通用”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 ;
}
} ;
This is another way to do this: As long as the functions are in the same namespace as the object they are referring too, they will be considered when the compiler will search for a fonction to handle ++t ;
这是执行此操作的另一种方法:只要函数与它们所引用的对象位于相同的命名空间中,编译器将在搜索处理
++t ;
时考虑它们++t ;
or t++ ;
或
t++ ;
code:代码:
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 ;
}
It is important to remember that, from a C++ viewpoint (including a C++ compiler viewpoint), those non-member functions are still part of T's interface (as long as they are in the same namespace).重要的是要记住,从 C++ 的观点(包括 C++ 编译器的观点)来看,那些非成员函数仍然是 T 接口的一部分(只要它们在同一个命名空间中)。
There are two potential advantages of the non-member function notation:非成员函数符号有两个潜在的优点:
Declare like so:像这样声明:
class A
{
public:
A& operator++(); //Prefix (++a)
A operator++(int); //Postfix (a++)
};
Implement properly - do not mess with what everyone knows they do (increment then use, use then increment).正确实施 - 不要混淆每个人都知道他们所做的事情(先增加然后使用,使用然后增加)。
I know it's late, but I had the same problem and found a simpler solution.我知道已经晚了,但我遇到了同样的问题并找到了一个更简单的解决方案。 Don't get me wrong, this is the same solution as the top one (posted by Martin York).
不要误会我的意思,这与上面的解决方案相同(由 Martin York 发布)。 It is just a bit simpler.
它只是简单一点。 Just a bit.
一点点。 Here it is:
这里是:
class Number
{
public:
/*prefix*/
Number& operator++ ()
{
/*Do stuff */
return *this;
}
/*postfix*/
Number& operator++ (int)
{
++(*this); //using the prefix operator from before
return *this;
}
};
The above solution is a bit simpler because it doesn't use a temporary object in the postfix method.上面的解决方案稍微简单一些,因为它没有在 postfix 方法中使用临时对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.