Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!corton!inria!seti!nuri.inria.fr!gautron From: gautron@nuri.inria.fr (Philippe Gautron) Newsgroups: comp.lang.c++ Subject: Assignment operator Message-ID: <1943@seti.inria.fr> Date: 19 Feb 91 18:18:27 GMT Sender: news@seti.inria.fr Reply-To: gautron@nuri.inria.fr (Philippe Gautron) Organization: INRIA Rocquencourt, Le Chesnay, France Lines: 100 The following example shows how difficult it can be to well understand assignment operator and copy constructor. This example was a student's answer to an examen about C++. The raw subject was supposed easy, a matrix 2-2 with operator overloading. Look at the code: - a constructor with default arguments - a copy constructor (no real need here except for completeness) - an assignment operator: here will be our problem - a printing function ------------------------------------------- # include // classe Matrix 2-2 class Matrix { int a1, a2, a3, a4; public: Matrix (int a1=0, int a2=0, int a3=0, int a4=0); Matrix (const Matrix&); Matrix operator= (const Matrix&); friend ostream& operator<< (ostream&, const Matrix&); }; Matrix::Matrix (int a1, int a2, int a3, int a4){ this->a1 = a1; this->a2 = a2; this->a3 = a3; this->a4 = a4; } Matrix::Matrix (const Matrix& m){ this->a1 = m.a1; this->a2 = m.a2; this->a3 = m.a3; this->a4 = m.a4; } Matrix Matrix::operator= (const Matrix& m){ return Matrix(m); // <=== } ostream& operator<< (ostream& stream, const Matrix& m){ stream << "a1= " << m.a1 << " a2= " << m.a2 << " a3= " << m.a3 << " a4= " << m.a4 << '\n'; return stream; } void f(){ Matrix m1(1,1,1,1), m2(2,2,2,2); cout << m1 << m2; m1 = m2; cout << m1 << m2; } ------------------------------------------- In the assignment operator function, the student used a smalltalk-like style, creating a new matrix in the function block and expecting a copy as return value. What cfront (the result is similar with g++) generates is (pseudo-C code): void operator= (Matrix *this, Matrix *result, Matrix *m){ ctor (result, m); } void f(){ Matrix m1; Matrix m2; ctor (&m1, 1, 1, 1, 1); ctor (&m2, 2, 2, 2, 2); Matrix result; // printing operator = (&m1, &result, &m2); // printing } There is no copy of m2 into m1. Note I'm using <> g++ version 1.37.1 (based on GCC 1.37) Any comment, please email-me directly, my News access is with some contortion by these days. ----------------------- Philippe Gautron, UUCP: gautron@rxf.ibp.fr Rank Xerox France / LITP Universite de Paris VI 4 place Jussieu, 75252 PARIS CEDEX 05 FRANCE