5
class compl{
    float re,im;

public:
    compl(float r, float i)
        {re=r; im=i;}
    compl& operator++()
        {++re; return*this;} //(1)
    compl operator++(int k){
        compl z=*this; re++; im+=k; return z;} //(2)
    friend compl& operator--(compl& z)
        {--z.re; return z;}
    friend compl operator--(compl& z,int k)
        {compl x=z; z.re--; z.im-=k; return x;}
};

(1) 为什么我们必须通过引用返回当前对象?据我了解,引用只是某物的第二个名称。

(2) 为什么我们必须将当前对象保存在z中,然后更改对象并返回未更改的z?这样做,我们将返回未增加的值。是不是因为后缀运算符的工作方式(它返回旧值,然后增加它)

4

3 回答 3

2

(1) 您不必这样做,但它是惯用的,因为它允许链接运算符或调用。

(2) 是的,后缀应该返回之前的值。

于 2015-04-29T12:38:04.353 回答
0

1- 运算符 ++ 重载必须通过引用返回,但如果您不需要变量的别名,您可以添加一个名为 next 的函数或具有相同结构的类似函数。

2-是的,因为您需要返回当前值然后增加变量。

于 2015-04-29T13:05:24.520 回答
-2

(1) 因为我们希望 ++ 也返回一个值,如

a = b++;

而且它的成本低于退回副本。

(2) 是的,这是后缀运算符的工作方式。这解释了为什么通常建议使用前缀递增编写带有迭代器的循环

for(iterator it = ..... ; it != .... , ++it) { ...}

而不是后缀递增:它避免了构建临时副本。

于 2015-04-29T12:43:39.557 回答