【发布时间】:2011-04-20 06:21:57
【问题描述】:
后缀a++和前缀++a如何以两种不同的方式重载operator++?
【问题讨论】:
后缀a++和前缀++a如何以两种不同的方式重载operator++?
【问题讨论】:
我知道已经晚了,但我遇到了同样的问题并找到了一个更简单的解决方案。不要误会我的意思,这是相同的解决方案,因为上面的解决方案(由 Martin York 发布)。它只是位简单一点。一点点。这里是:
class Number
{
public:
/*prefix*/
Number& operator++ ()
{
/*Do stuff */
return *this;
}
/*postfix*/
Number& operator++ (int)
{
++(*this); //using the prefix operator from before
return *this;
}
};
上面的解决方案稍微简单一点,因为它没有在 postfix 方法中使用临时对象。
【讨论】:
不同之处在于您为operator ++ 的重载选择了什么签名。
引用自相关article on this subject in the C++ FAQ(更多详情请前往此处):
class Number { public: Number& operator++ (); // prefix ++: no parameter, returns a reference Number operator++ (int); // postfix ++: dummy parameter, returns a value };
P.S.:当我发现这一点时,我最初看到的只是 dummy 参数,但不同的返回类型实际上更有趣;他们可能会解释为什么++x 被认为比x++ 更高效一般。
【讨论】:
应该是这样的:
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.
}
};
【讨论】:
Number operator++ (int)不使用int作为参数?
++x 是前缀,因此调用operator++() 而x++ 是后缀,因此调用operator++(int)
您有两种方法可以为类型 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 ;
}
} ;
这是执行此操作的另一种方法:只要函数与它们所引用的对象也在同一个命名空间中,编译器将在搜索处理++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 接口的一部分(只要它们在同一个命名空间中)。
非成员函数表示法有两个潜在的优点:
【讨论】:
这样声明:
class A
{
public:
A& operator++(); //Prefix (++a)
A operator++(int); //Postfix (a++)
};
正确实施——不要搞乱每个人都知道他们所做的事情(增加然后使用,使用然后增加)。
【讨论】: