问题源于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对象a
和b
,如果我执行c=a=b
(相当于c=a.operator=(b)
),那么这是真的吗这里完成了两件事:首先,a
与x
具有相同的y
和b
;第二,c
被设置为a
的别名/引用?我很感激任何例子。
答案 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
的值为a
和b
。再次,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
。