a + b |
operator+(a, b) |
The reason is very simple: the computer does not know how to manipulate informations in a user-defined classes
class Matrix3 { public: float A[3][3]; }; |
int main(int argc, char *argv[]) { Matrix3 M1, M2, M3; M3 = M1 * M2; // Matrix multiplication !!! }; |
M1 * M2 |
operator*(M1, M2) |
Matrix3 operator*(Matrix3 M1, Matrix3 M2) { Matrix3 r; int i, j, k; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) r.A[i][j] = 0; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) for (k = 0; k < 3; k=k+1) r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j]; return r; } |
Matrix3 operator*(Matrix3 M1, Matrix3 M2) { Matrix3 r; int i, j, k; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) r.A[i][j] = 0; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) for (k = 0; k < 3; k=k+1) r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j]; return r; } |
By value... in other words: by making a copy of the entire variable (in this case, copying 9 float variables)
But in every case, you have weight the benefit and the cost of safety through passing by value.
Matrix3 operator*(Matrix3 & M1, Matrix3 & M2) { Matrix3 r; int i, j, k; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) r.A[i][j] = 0; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) for (k = 0; k < 3; k=k+1) r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j]; return r; } |
CC -o operator03 -fast operator03.C CC -o operator04 -fast operator04.C
time operator03 time operator04
class Matrix3 { public: float A[3][3]; }; |
class Vector3 { public: float x[3]; }; |
Matrix3 M; Vector3 v1, v2; v2 = M * v1; // Matrix3 * Vector3 |
Vector3 operator*(Matrix3 & M, Vector3 & v) { Vector3 z; int i, j; for (i = 0; i < 3; i=i+1) z.x[i] = 0; for (i = 0; i < 3; i=i+1) for (j = 0; j < 3; j=j+1) z.x[i] = z.x[i] + M.A[i][j]*v.x[j]; return z; } |