问题源自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
的别名/引用?我将不胜感激任何例子。 最佳答案
这实际上取决于您如何声明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
。