operator=
まず、
#includeusing namespace std; class A { public: A() { cout << "A::A()" << endl; } A(const A& a) { cout << "A::A(const A&)" << endl; } virtual ~A() { cout << "A::~A()" << endl; } }; void main() { cout << "a" << endl; A x; cout << "b" << endl; A y = x; cout << "c" << endl; }
の実行結果は
a A::A() b A::A(const A&) c A::~A() A::~A()
となり、A y = x; の個所でコピーコンストラクタが呼ばれていることが分かる。
つぎに、
#includeusing namespace std; class A { public: A() { cout << "A::A()" << endl; } A(const A& a) { cout << "A::A(const A&)" << endl; } A& operator=(const A& a) { cout << "A& operator=(const A&)" << endl; return *this; } virtual ~A() { cout << "A::~A()" << endl; } }; void main() { cout << "a" << endl; A x; cout << "b" << endl; A y = x; cout << "c" << endl; y = x; cout << "d" << endl; }
とすると、実行結果は、
a A::A() b A::A(const A&) c A& operator=(const A&) d A::~A() A::~A()
となる。すなわち、A y = x; の個所では依然としてコピーコンストラクタが呼ばれるが、y = x; の個所では operator= が呼ばれている。記号としてはどちらも = を使っているが、意味が違うわけだ(前者がインスタンスを生成しているが、後者は既存のインスタンスを使っている)。