Q:

Why must I put a semicolon at the end of class declaration in C++?

In a C++ class declaration:
class Thing
{
    ...
};

why must I include the semicolon?

A:

The full syntax is, essentially,
class NAME { constituents } instances ;
where "constituents" is the sequence of class elements and methods, and "instances" is a comma-separated list of instances of the class (i.e., objects).
Example:
class FOO {
  int bar;
  int baz;
} waldo;

declares both the class FOO and an object waldo.
The instance sequence may be empty, in which case you would have just
class FOO {
  int bar;
  int baz;
};

You have to put the semicolon there so the compiler will know whether you declared any instances or not.
This is a C compatibility thing.

A:

because you can optionally declare objects 
class Thing
{
    ...
}instanceOfThing;

for historical reasons

A:

A good rule to help you remember where to put semicolons:

If it's a definition, it needs a semicolon at the end.  Classes, structs and unions are all information for the compiler, so need a trailing ; to mark no declared instances.
If it contains code, it doesn't need a semicolon at the end.  If statements, for loops, while loops and functions contain code, so don't need a trailing ;.

Namespaces also don't require a trailing semicolon, because they can contain a mix of both the above (so can contain code, so don't need a semicolon).

