It's mainly a question of usability.
Imagine a very simple base class:
class Base
{
public:
Base(char *name);
~Base();
char* name();
private:
char *mName;
};
And another simple class deriving from "Base":
class Thing : public Base
{
public:
Thing(char *name);
~Thing();
private:
int mDummy;
};
In the constructor of "Thing" you need to call the constructor of "Base", too:
Thing::Thing(char *name)
: Base(name)
, mDummy(0)
{
}
(even if you don't, the standard-constructor is called automatically)
Since the members of "Base" are declared 'private' there's no other way to initialize them.
Even if you have access to them, it's good habbit to have all initialization at a single place.
It's also quite reasonable to have the inherited part of the class initialized before the rest of the construction takes place (so it's put outside the curly braces).
For convenience you can initialize all 'primitive' types (like ints, floats, etc) just like they had their own constructors - which is the same as simply assigning a value.
In practice it makes sense to differ between the constructor-list (to get the object into a 'defined' state) and the constructor-code (which actually 'does' something).