explicit
, тогда запись obj = 1;
будет некорректной. Foo(const Foo &foo); // Конструктор копирования
Foo(int i); // Неявный конструктор
Foo& Foo::operator= (const Foo &foo); // Оператор присваивания
затем потихоньку его заполнить - по нему всё равно пройдётся конструктор по умолчанию