运算符重载。 q = q1+q2,q1 被修改,但我希望 q1 和 q2 保持不变
operator overload. q = q1+q2, q1 being modified but I want q1 and q2 to be intact
我在 1 或 2 周前学习了运算符重载,我想我知道它是如何工作的,但我正在尝试重载运算符 +
所以它 returns 一个新的 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
中,我有一个名为 qsuma
的对象 CCuaternion
,它接收重载返回的 CCuaternion
。它看起来像这样:
q1 = CCuaternion(0, 1, 0, 1); // at main.cpp
q2 = CCuaternion(1, 0, 0, 1);
qsuma = (q1+q2);
正如预期的那样,qsuma
以值 1, 1, 0, 2
结束。
q2
保持不变,但 q1
最终的值与 qsuma
相同。
你做错了:
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);
}
- 您正在使用
+=
- 请参阅
q2
的 const
修饰符
更新
在C++98中,const
表示logically constant
,程序员保证参数的状态在函数内部不会改变。
(注意:我更改了在声明末尾添加 const
的签名,因此 this
也可以是常量)
那么,为什么需要 const?
- 这是一个很好的做法:如果函数不会更改值,那么使用 const 会更礼貌。
- 您可能在其他上下文中需要它,我的意思是,您必须不仅能够将此运算符应用于变量,而且能够应用于常量。
重载加法运算符的首选方式是这样的:
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;
}
这使您的代码非常简单和直观,还可以让人们在您的 class 上使用 +=
。
我在 1 或 2 周前学习了运算符重载,我想我知道它是如何工作的,但我正在尝试重载运算符 +
所以它 returns 一个新的 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
中,我有一个名为 qsuma
的对象 CCuaternion
,它接收重载返回的 CCuaternion
。它看起来像这样:
q1 = CCuaternion(0, 1, 0, 1); // at main.cpp
q2 = CCuaternion(1, 0, 0, 1);
qsuma = (q1+q2);
正如预期的那样,qsuma
以值 1, 1, 0, 2
结束。
q2
保持不变,但 q1
最终的值与 qsuma
相同。
你做错了:
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);
}
- 您正在使用
+=
- 请参阅
q2
的
const
修饰符
更新
在C++98中,const
表示logically constant
,程序员保证参数的状态在函数内部不会改变。
(注意:我更改了在声明末尾添加 const
的签名,因此 this
也可以是常量)
那么,为什么需要 const?
- 这是一个很好的做法:如果函数不会更改值,那么使用 const 会更礼貌。
- 您可能在其他上下文中需要它,我的意思是,您必须不仅能够将此运算符应用于变量,而且能够应用于常量。
重载加法运算符的首选方式是这样的:
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;
}
这使您的代码非常简单和直观,还可以让人们在您的 class 上使用 +=
。