I would also say that multistage construction is not a good practice, unless an object can be reused -- that is if it it makes sense to redo the second construction step for the object. For example, if you want you socket to be re-binable to a different port, it makes sense to have a constructor that does not bind the port, and have a function that binds it later. It is still not a bad idea to have a constructor that does take a port. This is similar to the behavior of std::fstream.