A copy constructor accepts a reference to an object of its own class, typically declared as ClassName(const ClassName& obj). This allows creating new objects by copying existing ones, while simple constructors initialize without references and parameterized constructors accept different argument types.