This part is so called
ctor-initializer-list. In C++ it's a preferred way to initialize class members and the only method to pass constructor arguments to base class(es) constructors (the last feature is not used here). Alas, it's impossible to initialize non-integral types static data members in
ctor-initializer-list. That's why we do it separately in lines 32-37.
So
Suite(const Suite& suit):value(suit.value) {}
is the class Suite
copy constructor: it creates a Suite object from another object of the same type.
The point is that we must define all needed constructors (default constructor - line #5, copy constructor - line #6) if a class has user-defined constructor (see line #23).
Take into account that I don't want to allow users to construct arbitrary Suite objects (like
Suite card("Cheat") ). That's why the constructor defined in line #23 is protected. Now we can initialize four static Suite objects (lines 32-37) and construct all others via the copy constructor.
To allow Suite object arrays we need Suite default constructor (a constructor without parameters).
Oh, as usually
{} means copy constructor body (a constructor is a member function). It's
inline constructor - no need to call any real functions to construct a Suite object with this constructor.
More questions?..