= による初期化

Hoge hoge = ...;

という形での初期化は、まずデフォルトコンストラクタによってオブジェクトが構築され、それに対して代入演算子で代入を行うのではなく、引数つきのコンストラクタが呼び出される。

class Hoge {
public:
  Hoge(): n(0) {}
  Hoge(const int a): n(a) {}
private:
  int n;
  Hoge &operator=(const int a);
};

int main() {
  Hoge hoge = 3;  // Hoge hoge(3); と等価
  hoge = 5;       // oprator= が private なのでコンパイルエラー
}


逆に、 operator=だけ定義して引数付きコンストラクタを定義せずに

Hoge hoge = ...;

という形の初期化はできない。
デフォルトコンストラクタでオブジェクトを構築し、それに対して代入という操作を行うには明示的に二段階に分け、

Hoge hoge;
hoge = ...;

としなければならない。

追記

ツッコミがあったので補足しておきます。
仕様上は、まず引数付きコンストラクタにより新たなオブジェクトが構築され、それがコピーコンストラクタによって宣言した変数へとコピーされるという動作をするみたいです。
ただし、コピーコンストラクタの呼出しはコンパイラの最適化により省略してよいということで、コピーコンストラクタの中でコピー以外の操作をしようとすると期待通り動作しないので変なことはするな、と。