2009-01-21 44 views
2

在他的C++编程语言斯特劳斯给出INC/DEC超载下面的例子:重载增量的返回值

class Ptr_to_T { 
    T* p; 
    T* array ; 
    int size; 
public: 
    Ptr_to_T(T* p, T* v, int s); // bind to array v of size s, initial value p 
    Ptr_to_T(T* p); // bind to single object, initial value p 
    Ptr_to_T& operator++(); // prefix 
    Ptr_to_T operator++(int); // postfix 
    Ptr_to_T& operator--(); // prefix 
    Ptr_to_T operator--(int); // postfix 
    T&operator*() ; // prefix 
} 

为什么引用前缀经营回报,同时通过值后缀运算符的回报?

谢谢。

+0

应该是: Ptr_to_T&operator - (); //前缀 Ptr_to_T运算符 - (int); //后缀 – 2009-01-21 15:06:45

回答

8

为了更好地理解,你必须想象(或看看)这些操作符是如何实现的。通常情况下,++将被写入或多或少这样的前缀操作符:

MyType& operator++() 
{ 
    // do the incrementation 
    return *this; 
} 

由于this已被修改,“就地”,我们可以为了避免无用的副本返回实例的引用。

现在,这里的后缀运算符++代码:

MyType operator++(int) 
{ 
    MyType tmp(*this); // create a copy of 'this' 
    ++(*this); // use the prefix operator to perform the increment 
    return tmp; // return the temporary 
} 

作为后缀运算符返回一个临时的,它通过值返回它(否则,你会得到一个悬空参考)。

C++ Faq Lite也有一个关于这个问题的段落。

17

后缀运算符在值增加之前返回值的副本,所以它几乎必须返回一个临时值。前缀运算符确实返回对象的当前值,因此它可以返回对当前值的引用。

+0

加上你不能通过引用返回临时的事实,这是一个很好的答案。 – xtofl 2009-01-21 14:46:31

0

假设我使用重载的预增量来增加私有成员。不返回对私有成员的引用将++ private_var表达式转换为左值,从而可以直接修改私有成员?

+0

您不会将引用返回给私有成员,而是返回给您的类的对象。 (因为外部世界正在增加你的对象,而不是私人领域)。 – Kasprzol 2009-01-21 15:18:33