The following article answers your question better than I ever could. I have quoted a brief passage from the article to give you an idea of its flavor. A link appears below the quote.
Incidentally, the "C++ Reference Guide" from which I am quoting claims to have 529 pages of nutritious C++ information in it; you might want to bookmark it.
A constructor initializes an object. A default constructor is one that
can be invoked without any arguments. If there is no user-declared
constructor for a class, and if the class doesn't contain const or
reference data members, C++ implicitly declares a default constructor
for it.
Such an implicitly declared default constructor performs the
initialization operations needed to create an object of this type.
Note, however, that these operations don't involve initialization of
user-declared data members.
For example:
class C
{
private:
int n;
char *p;
public:
virtual ~C() {}
};
void f()
{
C obj; // 1 implicitly-defined constructor is invoked
}
C++ synthesized a constructor for class C because it contains a
virtual member function. Upon construction, C++ initializes a hidden
data member called the virtual pointer, which every polymorphic class
has. This pointer holds the address of a dispatch table that contains
all the virtual member functions' addresses for that class.
The
synthesized constructor doesn't initialize the data members n and p,
nor does it allocate memory for the data pointed to by the latter.
These data members have an indeterminate value once obj has been
constructed. This is because the synthesized default constructor
performs only the initialization operations that are required by the
implementation—not the programmer—to construct an object.
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15