C++ 前缀和后缀运算符c++;

C++ 前缀和后缀运算符c++;,c++,operators,postfix-operator,prefix-operator,C++,Operators,Postfix Operator,Prefix Operator,(1) 为什么我们必须通过引用返回当前对象?据我所知,引用只是某事物的第二个名称 (2) 为什么我们必须在z中保存当前对象,然后更改对象并返回未更改的z?这样做,我们将返回未增加的值。这是因为后缀运算符的工作方式(它返回旧值,然后增加值)(1)您不必这样做,但它是惯用的,因为它允许链接运算符或调用 (2) 是的,后缀应该返回上一个值。(1)因为我们希望++也返回一个值,如中所示 class compl{ float re,im; public: compl(float r, f

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

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

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

(2) 是的,后缀应该返回上一个值。

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

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;}
};
而且它比退回一份要便宜

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

a = b++;

代替后缀递增:它避免生成临时副本。

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


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

1。操作员链接2。post Increment我会问,为什么要让后缀运算符成为朋友?他们是成员功能的完美候选人。这是本书中的一个例子。因为它们更改了参数的值,所以最好将它们作为成员函数来编写吗?@KiokoKey我认为没有理由
friend
它们。它们与对象紧密相关,因此它们应该是成员函数。一般来说,您需要一个稍微解耦的函数来访问您的私有/受保护的成员,例如
运算符(1)是不正确的,OP问为什么前缀
运算符+++
必须返回一个引用。1)它必须返回一些值,以便我们可以在赋值中使用它。这只剩下两种可能性-按值-按引用2)按值返回成本更高-如果递增的作为参数传输到函数(按引用)也不起作用。同意,但您对(1)的解释不正确。首先,你有一个后缀。其次,
a=++b
仍将复制,即使
++b
返回引用(当然,除非
a
是引用)。在诸如
++b=something
之类的作业中,它确实有用。
for(iterator it = ..... ; it != .... , ++it) { ...}