Разные конструкторы..
class CTest {
friend Foo;
CTest(); // для защиты объявлен закрытым
CTest(Parametrs); // копирующий конструктор, пользуется Foo
public:
CTest& operator=(CTest&); // оператор присваивания
}
В этом примере приведено три способа создания объкта CTest. Один из них - закрытый, может использоваться только другом Foo. Никто, кроме него не может создавать экземпляр с некими параметрами. Конструктор по умолчанию тоже можно объявить закрытым, чтоб никто до него не достучался. Копирующий конструктор имеет на входе уже инициализированный экземпляр, его могут пользовать все, кто угодно.
Обычно, создание и копирование объекта - это весьма разные операции, которые удобно разделять..