c++ - 如何将 C++ 关键字 "this"与成员函数 "operator="一起使用?

标签 c++ class reference operator-overloading

问题源于cplusplus .表示二维 vector 的类定义如下,

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)),那么这里做了两件事是真的吗:第一,a有相同的xy 作为 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 的值为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

关于c++ - 如何将 C++ 关键字 "this"与成员函数 "operator="一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40063268/

相关文章:

c++ - C++ 的开源 Graph 类

c++ - 如何将数组的所有元素更改为特定值?

c++ - 未解析的外部符号静态变量(标题中定义的方法使用的变量)

class - Dart:基于 JSON 响应创建动态类

java - Java 中的池类是什么?

c++ - 从 std::list 中移除一个对象

java - 绑定(bind)同一个接口(interface)两次(Guice)

c# - .NET 项目引用 : How to reference a dll via a referenced project?

c++ - 我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以

覆盖对象时的 Perl 内存管理