= による初期化
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 = ...;
としなければならない。