如何使用C ++关键字“this”以及成员函数“operator =”?

时间:2016-10-15 19:21:00

标签: c++ class reference operator-overloading

问题源于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的别名/引用?我很感激任何例子。

1 个答案:

答案 0 :(得分:1)

这实际上取决于你是如何声明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