Оставляя в стороне, что второй конструктор не является конструктором копирования - вы действительно хотели знать, когда будет вызван второй конструктор.
Конструктор Foo(Foo* obj);
является конструктором с одним параметром - поскольку он не был помечен ключевым словом explicit
, он обеспечивает неявное преобразование из Foo*
в Foo
. Его можно вызывать в любое время, когда вместо Foo
или const Foo&
используется Foo*
- если он вызывается неожиданно, это почти наверняка происходит.
Как правило, конструкторы с одним параметром должны быть либо конструкторами копирования (что объяснили другие ответы), либо должны быть помечены explicit
. Конструкторы, которые обеспечивают неявные преобразования, должны использоваться экономно.