x = expression; |
operator=(x, expression); |
class Matrix3x3 { public: double A[3][3]; // 9 doubles }; int main(int argc, char *argv[]) { Matrix3x3 A, B; B = A; // Copies 9 doubles } |
class MatrixNxN { public: double *A; // Contains an address int N; /* ------------------------ Constructor(int) ------------------------ */ MatrixNxN(int n) { A = new double[n*n]; N = n; } }; int main(int argc, char *argv[]) { int N = 3; MatrixNxN A(N), B(N); B = A; // Copies 2 variables only } |
The result of the assignment operation is not a new copy of a matrix !
You will see that Matrix B points to the same matrix as Matrix A
The assignment operator function operator= must be a member function |
class MatrixNxN { public: double *A; // Contains an address int N; /* ------------------------ Constructor(int) ------------------------ */ MatrixNxN(int n) { A = new double[n*n]; N = n; } }; // Ordinary function can NOT be operator= !!! void operator=(MatrixNxN & m1, MatrixNxN & m2) { int i, j; if ( m1.N != m2.N ) { cout << "** Error: Unequal size matrices..." << endl << endl; return; } for (i = 0; i < m1.N; i=i+1) for (j = 0; j < m1.N; j=j+1) m1.A[i*m1.N+j] = m2.A[i*m1.N+j]; } int main(int argc, char *argv[]) { int N = 3; MatrixNxN A(N), B(N); B = A; // Copy matrix } |
class MatrixNxN { public: double *A; // Contains an address int N; /* ------------------------ Constructor(int) ------------------------ */ MatrixNxN(int n) { A = new double[n*n]; N = n; } // Member function operator= void operator=(MatrixNxN & m2) { int i, j; if ( m1.N != m2.N ) { cout << "** Error: Unequal size matrices..." << endl << endl; return; } for (i = 0; i < m1.N; i=i+1) for (j = 0; j < m1.N; j=j+1) m1.A[i*m1.N+j] = m2.A[i*m1.N+j]; } }; int main(int argc, char *argv[]) { int N = 3; MatrixNxN A(N), B(N); B = A; // Copy matrix } |
 
int x, y, z; x = y = z; |
|
int x, y z; z= 4; x = y = z; => x = (y = z); // Assigns z to y and returns value of z (4) => x = z; // Assigns z to x and returns value of z (4) |
class MatrixNxN { public: double *A; // Contains an address int N; /* ------------------------ Constructor(int) ------------------------ */ MatrixNxN(int n) { A = new double[n*n]; N = n; } // Member function operator= void operator=(MatrixNxN & m2) { int i, j; if ( m1.N != m2.N ) { cout << "** Error: Unequal size matrices..." << endl << endl; return; } for (i = 0; i < m1.N; i=i+1) for (j = 0; j < m1.N; j=j+1) m1.A[i*m1.N+j] = m2.A[i*m1.N+j]; } }; int main(int argc, char *argv[]) { int N = 3; MatrixNxN A(N), B(N), C(N); C = B = A; // Error !!! } |
C = B = A; => C = (B = A); // Assigns B to A (that's OK), // but does NOT return anything.... => C = void; // Disallowed |
A cascading assignment operator:
class MatrixNxN { public: double *A; // Contains an address int N; /* ------------------------ Constructor(int) ------------------------ */ MatrixNxN(int n) { A = new double[n*n]; N = n; } // Member function operator= MatrixNxN & operator=(MatrixNxN & m2) { int i, j; if ( m1.N != m2.N ) { cout << "** Error: Unequal size matrices..." << endl << endl; return; } for (i = 0; i < m1.N; i=i+1) for (j = 0; j < m1.N; j=j+1) m1.A[i*m1.N+j] = m2.A[i*m1.N+j]; return(m2); } }; int main(int argc, char *argv[]) { int N = 3; MatrixNxN A(N), B(N), C(N); C = B = A; // Error !!! } |
|
|
Whenever
you define a
copy-constructor
for some class, you
must also define
an
assignment operator
And vice versa |
When you use a new operator in a constructor (to allocate space for some variable), you must provide a destructor to de-allocate the space allocated by the new operator |