You can compile programs with default constructors that are declared but not defined if you don't try to invoke the default constructor. I do this with the assignment operator and copy constructor sometimes, when I want to not allow these operations implicitly. But remember that the default constructor gets called a lot in C++ implicitly, and is often assumed to exist by the STL. So that most likely wasn't what you wanted to do.