sto*_*rin 2 c++ multiplication variable-assignment operator-keyword
有人可以解释我运营商的错误:
Matrix3D Matrix3D::operator*(Matrix3D& m) {
Matrix3D ret;
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
ret._data[i][j]=0.0;
for(int k=0;k<4;k++) {
ret._data[i][j] += (this->_data[i][k]*m._data[k][j]);
}
}
}
return ret;
}
Matrix3D& Matrix3D::operator=(Matrix3D& m) {
if(this==&m) {
return *this;
}
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
this->_data[i][j] = m._data[i][j];
}
}
return *this;
}
Matrix3D Matrix3D::Rotation(double ax, double ay, double az) {
Matrix3D rotX;
Matrix3D rotY;
Matrix3D rotZ;
rotX(
1, 0, 0, 0,
0, cos(ax), -sin(ax), 0,
0, sin(ax), cos(ax), 0,
0, 0, 0, 1
);
rotY(
cos(ay), 0, sin(ay), 0,
0, 1, 0, 0,
-sin(ay), 0, cos(ay), 0,
0, 0, 0, 1
);
rotZ(
cos(az), -sin(az), 0, 0,
sin(az), cos(az), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
// Matrix3D ret;
// ret = rotX*rotY*rotZ;
// This doesn't work
// C:\(...)\Matrix3D.cpp|100|error: no match for 'operator=' in 'ret = Matrix3D::operator*(Matrix3D&)(((Matrix3D&)(& rotZ)))'|
// however this does work
Matrix3D ret = rotX*rotY*rotZ;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
如上面的代码所述,类似于
Matrix3D ret;
ret = rotX*rotY*rotZ;
Run Code Online (Sandbox Code Playgroud)
会导致
C:\(...)\Matrix3D.cpp|100|error: no match for 'operator=' in 'ret = Matrix3D::operator*(Matrix3D&)(((Matrix3D&)(& rotZ)))'|
Run Code Online (Sandbox Code Playgroud)
编译错误,而类似的东西
Matrix3D ret = rotX*rotY*rotZ;
Run Code Online (Sandbox Code Playgroud)
将编译时没有任何警告或错误(不知道矩阵是否正确,还没有检查...).
实际上,两个运营商都被错误地宣布.他们应该const参考允许接受rvalues.
Matrix3D Matrix3D::operator*(const Matrix3D& m) const
// ^^^^^ ^^^^^
// this too, since you're not
// changing the LHS during '*'.
Matrix3D& Matrix3D::operator=(const Matrix3D& m)
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
你会发现这*不起作用rotX*(rotY*rotZ).
Matrix3D ret = rotX*rotY*rotZ;编译的原因是因为operator=根本没有调用.它只是将Matrix3D的复制构造函数调用为乘法的结果.并且乘法因为rotX * rotY * rotZ被重写而起作用
rotX.operator*(rotY).operator*(rotZ)
Run Code Online (Sandbox Code Playgroud)
和rotY和rotZ都是左值,因此它们可以被绑定到Matrix3D&.
operator*和operator=:Matrix3D Matrix3D::operator* (Matrix3D const& m) const;
Matrix3D& Matrix3D::operator= (Matrix3D const& m);
Run Code Online (Sandbox Code Playgroud)
你的operator=接受Matrix3D&虽然rotX*rotY*rotX将导致右值,并为此你不能绑定到它的参考.
为了使你的工作operator=应该接受一个Matrix3D const&,它可以同时绑定左值和右值.
即使它看起来像是Obj a = b使用Obj::operator=它不是,它将使用通常被称为复制构造函数.在这里阅读更多相关信息.