Пространства имён
Варианты
Действия

Объявление класса

Материал из cppreference.com
 
 
 
 

Классы это определяемые пользователем типы, определяемые спецификатором класса, который появляется в последовательности-спецификаторов-объявления синтаксиса объявления.

Синтаксис

Спецификатор класса имеет следующий синтаксис:

ключевое-слово-класса атрибуты (необязательно) имя-заголовка-класса final(необязательно) предложение-базы (необязательно) { спецификация-элемента } (1)
ключевое-слово-класса атрибуты (необязательно) предложение-базы (необязательно) { спецификация-элемента } (2)
1) определение именованного класса
2) определение безымянного класса
ключевое-слово-класса один из class, struct и union. Ключевые слова class и struct идентичны, за исключением значения по умолчанию доступа к элементам и значения по умолчанию доступа к базовому классу. Если это union, объявление вводит тип объединения.
атрибуты (начиная с C++11) любое количество атрибутов, может включать спецификатор alignas
имя-заголовка-класса имя определяемого класса, необязательно квалифицированное
final (начиная с C++11) если присутствует, класс не может наследоваться
предложение-базы список из одного или нескольких базовых классов и модель наследования, используемая для каждого из них (смотрите производный класс)
спецификация-элемента список спецификаторов доступа, объявлений и определений объектов-элементов и функций-элементов (смотрите ниже).

Предварительное объявление

Объявление следующей формы

ключевое-слово-класса атрибуты идентификатор ;

Объявляет тип класса, который будет определён позже в этой области. Пока не появится определение, это имя класса имеет неполный тип. Это позволяет классам ссылаться друг на друга:

class Vector; // предварительное объявление

class Matrix
{
    // ...
    friend Vector operator*(const Matrix&, const Vector&);
};

class Vector
{
    // ...
    friend Vector operator*(const Matrix&, const Vector&);
};

и если конкретный исходный файл использует только указатели и ссылки на класс, это позволяет уменьшить #include зависимости:

// в MyStruct.h 
#include <iosfwd> // содержит предварительное объявление std::ostream

struct MyStruct
{
    int value;
    friend std::ostream& operator<<(std::ostream& os, const S& s);
    // определение предоставлено в файле MyStruct.cpp, который использует
    // #include <ostream>
};

Если предварительное объявление появляется в локальной области видимости, оно скрывает ранее объявленный класс, переменную, функцию и все другие объявления с тем же именем, которые могут появляться в окружающих областях видимости: