Класс, как тип, определяемый пользователем, должен содержать скрытые поля (private) и следующие функции:
  1. конструкторы, определенные как инициализирующиеся объекты класса;
  2. методы, реализующие свойства класса (методы, возвращающие значения скрытых полей класса описываются с модификатором const, который указывает, что они не должны изменять значения этих полей);
  3. операции, позволяющие копировать, присваивать, сравнивать объекты и производить над ними другие действия, требуемые по сути класса;
  4. необходим еще функциональный класс исключений, используемый для сообщений об ошибках, с помощью генерации исключительных ситуаций.

Могут также использоваться функции, которые работают с классом или несколькими классами через интерфейс (т.е. доступ к скрытым полям им не требуется). Эти функции можно описать вне классов, чтобы не перегружать интерфейс. Чтобы обеспечить логическую связь, можно поместить их в общее с этим классом пространство имен.
Пример 1

namespace staff
{
class monstr{...};
class hero{...};
void interact(hero, monstr);
}
Пример 2
class String {
 public:
   // набор конструкторов
   // для автоматической инициализации
   // String strl;              // String()
   // String str2( "literal" ); // String( const char* );
   // String str3( str2 );      // String( const String& );
 
   String();
   String( const char* );
   String( const String& );
 
   // деструктор
   ~String();
 
   // операторы присваивания
   // strl = str2
   // str3 = "a string literal"
 
   String& operator=( const String& );
   String& operator=( const char* );
 
   // операторы проверки на равенство
   // strl == str2;
   // str3 == "a string literal";
 
   bool operator==( const String& );
   bool operator==( const char* );
 
   // перегрузка оператора доступа по индексу
   // strl[ 0 ] = str2[ 0 ];
 
   char& operator[]( int );
 
   // доступ к членам класса
   int   size() { return _size; }
   char* c_str() { return _string; }
 
 private:
   int  _size;
   char *_string;
 }