Yes, it is optional and generally omitted.
However, it may be essential for accessing variables after they have been overridden in the scope:
Person::Person() {
int age;
this->age = 1;
}
Also, this:
Person::Person(int _age) {
age = _age;
}
It is pretty bad style; if you need an initializer with the same name use this notation:
Person::Person(int age) : age(age) {}