Классы

Класс есть тип, во многим схожий со структурой, но имеющий ряд отличий:

  • Класс не может быть инициализирован через {} инициализатор. Для инициализации класса используются только конструкторы.
  • Для класса не генерируются конструктор копирования и копирующий оператор присваивания. Если это необходимо, нужно явно указать компилятору, что их надо сгенерировать.
  • Класс не может быть 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_;
}

fn Foo()
{
    var A mut a;
    a.SetX(42); // Ок, обращаемся к "public" члену
    auto x= a.GetX(); // Ок, обращаемся к "public" члену
    a.x_= 42; // Будет порождена ошибка - обращение к непубличному члену класса
}