【问题标题】:How do I use C++ keyword "this" along with member function "operator="?如何使用 C++ 关键字“this”和成员函数“operator=”?
【发布时间】:2016-10-15 19:20:59
【问题描述】:

问题源于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)),那么这里确实做了两件事:第一, ab 具有相同的 xy;第二,c 设置为a 的别名/引用?我会很感激任何例子。

【问题讨论】:

  • 这只是一个多重赋值。 c=a=b 首先执行a=b,然后是c=a。很长一段时间以来,我倾向于从operator= 返回void,以避免这种有问题的构造,但后来我了解到标准库容器要求容器项的复制赋值运算符返回对分配给的对象的引用。
  • 还是一头雾水。我想知道您是否将c 定义为CVector & c; 但对于ab,它们被定义为CVector?其次,ab是不是真的是不同的对象(虽然xy在执行后是一样的)但是ca是同一个对象(具有相同的地址)到期到return *this;?@Cheersandhth.-Alf
  • 你是说如果我们只想设置a.xa.y等于b.xb.y,那么我们可以只使用a=b而不用打扰多重赋值?@Cheersandhth .-阿尔夫
  • 最后一个问题是:由于c 是引用类型而不是类型CVector,所以c=a 中的= 符号只是一个普通的赋值符号,但= 符号in a=b 是特殊的,仅在 CVector 对象之后复制成员 xy 的值 = 符号(此处为 b)?@Cheersandhth.-Alf
  • 您需要提供一个完整但最小的示例,供读者直接试用。关于c 作为参考的事情在问题中并不明显。目前尚不清楚这是有意的还是误解。现在投票结束,因为缺乏这种可重复的例子。

标签: c++ class reference operator-overloading


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2019-08-20
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多