C++ C++;操作员=过载有选择地工作

C++ C++;操作员=过载有选择地工作,c++,C++,我似乎有一个赋值操作符,它在周边工作。 我有一个Vector2类,它包含两个float,x和y。 以下是运算符=方法: Vector2 Vector2::operator=(const Vector2 &right) { Vector2 result; result.x = right.x; result.y = right.y; return result; } 在实体的onMove方法中,我有: Vector2 newPosition = posit

我似乎有一个赋值操作符,它在周边工作。 我有一个Vector2类,它包含两个float,x和y。 以下是运算符=方法:

Vector2 Vector2::operator=(const Vector2 &right)
{
    Vector2 result;
    result.x = right.x;
    result.y = right.y;
    return result;
}
在实体的onMove方法中,我有:

Vector2 newPosition = position + (speed * getSpeedFactor());

if (posValid(newPosition))
{
    position.x = newPosition.x;
    position.y = newPosition.y;
    //position = newPosition;
}
其中speedFactor取决于帧率,posValid是检查点是否在墙上或其他地方。位置和速度也是矢量2。 第一项任务:

Vector2 newPosition = position + (speed * getSpeedFactor());
但是,如果代码按原样运行,我将获得预期/预期的行为

position = newPosition;
没有任何影响,无论是对其自身还是在.x和.y赋值之前或之后。

您的
运算符=()
错误,它应该修改当前对象,而不是您创建的额外对象

Vector2& Vector2::operator=(const Vector2 &right) 
{
  x = right.x; 
  y = right.y; 
  return *this; 
}
注意:返回类型是一个引用,您返回的是对当前对象的引用,而不是它(或类似于代码中的新对象)的副本

它成功的原因是什么

Vector2 newPosition = ...;
因为这不是默认的构造+赋值,而是复制构造调用。

您的
运算符=()
错误,它应该修改当前对象,而不是您创建的额外对象

Vector2& Vector2::operator=(const Vector2 &right) 
{
  x = right.x; 
  y = right.y; 
  return *this; 
}
注意:返回类型是一个引用,您返回的是对当前对象的引用,而不是它(或类似于代码中的新对象)的副本

它成功的原因是什么

Vector2 newPosition = ...;

这是因为这不是默认的构造+赋值,而是一个复制构造调用。

您实际上并没有分配到
位置。您正在创建一个临时的
Vector2
对象,分配给它,然后隐式复制它并返回副本。您永远不会修改实际对象

你需要像这样的东西:

Vector2& Vector2::operator=(const Vector2 &right)
{
    x = right.x;
    y = right.y;
    return *this;
}

您实际上并没有分配到
位置
。您正在创建一个临时的
Vector2
对象,分配给它,然后隐式复制它并返回副本。您永远不会修改实际对象

你需要像这样的东西:

Vector2& Vector2::operator=(const Vector2 &right)
{
    x = right.x;
    y = right.y;
    return *this;
}

第一个不是赋值运算符,而是构造函数。另外,您应该返回
Vector2&
。它也在对象上被调用,因此您应该修改对象,而不是临时结果。运算符=通常应返回对其自身的引用。请注意:第一个运算符不是赋值运算符,而是构造函数。另外,您应该返回
Vector2&
。它也在对象上被调用,因此您应该修改对象,而不是临时结果。运算符=通常应返回对自身的引用。请看一看:“是因为编译器优化了默认构造+对副本构造调用的赋值”--这不是优化。当初始化中使用
=
时,它不是赋值,而是对复制构造函数的调用。“是因为编译器优化了默认构造函数+对复制构造函数调用的赋值”--它不是优化。当在初始化中使用
=
时,它不是赋值,而是对复制构造函数的调用。