operator=

まず、

#include 
using 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; の個所でコピーコンストラクタが呼ばれていることが分かる。
つぎに、

#include 
using 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= が呼ばれている。記号としてはどちらも = を使っているが、意味が違うわけだ(前者がインスタンスを生成しているが、後者は既存のインスタンスを使っている)。