Классы¶
Класс есть тип, во многим схожий со структурой, но имеющий ряд отличий:
- Класс не может быть инициализирован через
{}
инициализатор. Для инициализации класса используются только конструкторы. - Для класса не генерируются конструктор копирования и копирующий оператор присваивания. Если это необходимо, нужно явно указать компилятору, что их надо сгенерировать.
- Класс не может быть
constexpr
типом. - Класс может принимать участие в наследовании (может иметь предков и/или потомков).
- Класс может иметь спецификаторы видимости.
Объявляется класс с использованием ключевого слова class
вместо struct
.
Спецификаторы видимости¶
При перечислении членов класса может быть объявлен один из трёх спецификаторов видимости - public
, private
, protected
.
Все члены класса, после данного спецификатора и до следующего спецификатора или конца класса будут иметь данную видимость.
Видимость членов от начала класса до первого спецификатора считается public
.
Спецификатор видимости public
означает, что член класса доступен отовсюду. private
означает, что к члену класса можно обратиться только из пространства имён самого класса и вложенных в него пространств имён.
protected
означает, что к члену класса имеют доступ только классы-наследники.
class A
{
public:
fn GetX(this) : i32 { return x_; }
fn SetX(mut this, i32 in_x) { x_= in_x; }
private:
i32 x_= 0;
}
fn Foo()
{
var A mut a;
a.SetX(42); // Ок, обращаемся к "public" члену
auto x= a.GetX(); // Ок, обращаемся к "public" члену
a.x_= 42; // Будет порождена ошибка - обращение к непубличному члену класса
}