Оператор присваивания operator= не является конструктором (хотя бы из названия).

class A
{
public:
A() // конструктор по умолчанию обычный
{
qDebug() << "A() this:" << this << " // easy default ctor";
}
A(const A& in) // конструктор по умолчанию копирования
{
qDebug() << "A(const A& in) " << " this:" << this << " // default copy ctor";
}
A& operator= (const A &cl);
~A()
{
qDebug() << "~A " << this;
}
};
A& A::operator=(const A &cl)
{
qDebug() << "A& A::operator=(const A &cl)";
return *this;
}
void foo()
{
A clA;
A clB = clA; // вызывается конструктор копирования
clB = clA; // вызывается оператор присваивания
qDebug() << "<- foo()";
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "--------main()---------";
qDebug() << "-> foo()";
foo();
qDebug() << "return from foo()";
return a.exec();
}
A clB = clA; вызывает конструктор (копирования). Это связано с тем, что clB еще не создан. Компилятор должен создать clB конструктором по умолчанию (обычным) и инициализировать его данными класса A (буквально побитово). А это и есть роль конструктора копирования. Поэтому компилятор вызывает конструктор копирования. Такие нюансы конечно же путают немного, но все есть дело привычки, проходит время и если все работает правильно человек привыкает.
Еще вот на картинке можно посмотреть (мы тренируемся в среде Qt 4.8.1 msvc-2010):

Чтобы все таки оператор присваивания вызывался строку A clB = clA; можно заменить на две строчки A clB; и clB= clA; и тогда во второй строке вызовется оператор присваивания:
void foo()
{
A clA;
A clB; // вызывается конструктор обычный
clB = clA; // вызывается оператор присваивания
qDebug() << "<- foo()";
}
вывод консоли:
--------main()---------
-> foo()
A() this: 0x7af9fe // easy default ctor
A() this: 0x7af9ff // easy default ctor
A& A::operator=(const A &cl)
<- foo()
~A 0x7af9ff
~A 0x7af9fe
return from foo()
Результат получется аналогичный.