当前位置:  开发笔记 > 编程语言 > 正文

重载增量的返回值

如何解决《重载增量的返回值》经验,为你挑选了2个好方法。

在他的C++编程语言中,Stroustrup为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
}

为什么前缀运算符通过引用返回,而后缀运算符按值返回?

谢谢.



1> Timo Geusch..:

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



2> Luc Touraill..:

为了更好地理解,您必须想象(或看看)这些运算符是如何实现的.通常,前缀运算符++将或多或少地写为:

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精简版也有关于这个问题的一个段落.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有