The single colon specifies an initialization list, as the other couple of responses have already stated.
There are a number of gotchas about these lists and constructors in general. C++ does a reasonable job of generating default constructors and copy constructors but if you write your own, it leaves it up to you to handle everything:
- Be cautious of using use the word invoke because the presence on the list specifies which constructor will be used, it doesn't actually invoke that constructor. By that I mean that the order of invocation is governed solely by the class declaration. Most compilers will warn you if the initalizations are non in the same order as declared. The order is - base classes constructors in the order of declaration then member variables. It might help to think of it as a depth-first traversal up the class hierarchy.
- The items in the list are specifications of which member variable or base class constructors will be used - particularly important for writing copy constructors.
- Base classes that are not specified in the list will have their default constructor invoked. This is a major gotcha when you write your own copy constructor - you have to be careful to specify the base copy constructors otherwise they will not get their members copied.
- Members not in the list are not initialized
- As a corollary to 4. you therefore have a maintenance headache of having to remember to add members to each constructor.
- As a good practice, try not to rely on member initialization order anyway. You should try very hard to avoid code where one member must be initialized before another.