操作员超载。 q = q1 + q2,q1被修改,但我希望q1和q2完好无损

时间:2015-03-07 00:28:51

标签: c++ visual-studio-2012 operator-overloading

我在1或2周前学过运算符重载,我想我知道它是如何工作的但是我试图重载运算符+所以它返回一个新的CCuaternion正在工作好吧,但是

CCuaternion(float w, float x, float y, float z) {
    this->w = w;
    this->x = x;
    this->y = y;
    this->z = z;
} //Ccuaternion constructor at Ccuaternion.h

CCuaternion operator + (CCuaternion &q2); // at CCuaternion.h

CCuaternion CCuaternion::operator + (CCuaternion &q2){ // at Ccuaternion.cpp
CCuaternion suma;

suma.setW(w += q2.getW());
suma.setX(x += q2.getX());
suma.setY(y += q2.getY());
suma.setZ(z += q2.getZ());

return suma; }

在我的main中,我有一个名为CCuaternion的对象qsuma,它接收重载正在返回的CCuaternion。它看起来像这样:

q1 = CCuaternion(0, 1, 0, 1); // at main.cpp
q2 = CCuaternion(1, 0, 0, 1);

qsuma = (q1+q2);

正如所期望的那样,qsuma最终会得到值1, 1, 0, 2q2保持不变,但q1最终与qsuma的值相同。

2 个答案:

答案 0 :(得分:2)

重载加法运算符的首选方法是这样的:

CCuaternion & CCuaternion::operator += (CCuaternion const &q2)
{
    w += q2.w;
    x += q2.x;
    y += q2.y;
    z += q2.z;

    return *this;
}

这是一个非会员功能:

CCuaternion operator + (CCuaternion q1, CCuaternion const &q2)
{
    return q1 += q2;
}

这可以让您的代码非常简单直观,还可以让人们在您的课程中使用+=

答案 1 :(得分:0)

你的做法是错误的:

CCuaternion operator + (const CCuaternion& q2) const; // at CCuaternion.h

CCuaternion CCuaternion::operator + (const CCuaternion &q2) const { // at Ccuaternion.cpp
    return CCuaternion(w + q2.w, 
                       x + q2.x, 
                       y + q2.y, 
                       z + q2.z);
}
  1. 您使用的是+=
  2. 请参阅const
  3. q2修饰符

    <强>更新

    在C ++ 98中,const表示logically constant,程序员承诺在函数内部不会更改参数的状态。

    (注意:我在声明末尾更改了添加const的签名,因此this也可以保持不变)

    那么,为什么你需要const?

    1. 这是一个很好的做法:如果函数不会改变值,那么使用const就更有礼貌了。
    2. 您可能在另一个上下文中需要它,我的意思是,您必须能够将此运算符不仅应用于变量,还应用于常量。