问题源自cplusplus。定义二维矢量的类定义如下,

class CVector {
  public:
    int x,y;
    CVector () {}
    CVector (int a, int b) : x(a), y(b) {}
    CVector& operator = (const CVector&);
};

CVector& CVector::operator= (const CVector& param)
{
  x=param.x;
  y=param.y;
  return *this;
}


我的问题是如何使用operator =?例如,

CVector a, b;
b.x = 1;
b.y = 3;
CVector & c = a = b;


我现在的困惑是,假设有两个CVector对象ab,并且如果我执行c=a=b(等效于c=a.operator=(b)),那么这里确实做了两件事吗:首先,ax具有相同的yb;第二,c是否设置为a的别名/引用?我将不胜感激任何例子。

最佳答案

这实际上取决于您如何声明c

如果c只是CVector,则表达式

a=b;


返回CVector&。然后,由于c是完整对象而不是引用,因此编译器正在寻找方法XXX operator = (CVector&)

现在,CVector没有任何XXX operator = (CVector&)方法(请注意,该方法获取引用,而不是const引用),但是具有CVector& operator = (const CVector&)(获取const引用的方法)。

引用到const引用之间的转换是否被允许?是的,因此将调用方法CVector& operator = (const CVector&)

现在,c具有值ab。同样,c是一个对象。

现在,如果您将c声明为CVector&const CVector&(引用),则表达式

CVector& c = a = b;


将别名c作为a,因为您已将a.operator =(b)返回的引用分配给了另一个引用。

总结起来,两者之间是有区别的
CVector c = a = b;

CVector& c = a = b;,第一个将a的数据“复制”到实际对象c,而最后一个将c别名为a

10-08 00:44