Что такое С++ эквивалент С# readonly модификатор поля?

Состояние блокировки велико. В С# вы можете убедиться, что поле не изменит его значение/ссылку после завершения конструктора, объявив его как readonly.

class Foo
{
    private readonly string _foo;

    public Foo() {
        _foo = "Unchangeable";
    }

    public void ChangeIt() {
        _foo = "Darn";        // compiler error
    }
}

Могу ли я сделать то же самое с С++? Если да, то как? Если нет, почему бы и нет?

Ответы

Ответ 1

Это будет const. Обратите внимание, что это ключевое слово означает пару разных вещей в разных контекстах.

Ответ 2

class Foo
{
private:
    const string _foo;
public:
    Foo() : _foo("Unchangeable")
    {
    }
    void ChangeIt()
    {
        _foo = "Darn";        // compiler error
    }
};

Ответ 3

Мне не сразу стало ясно после того, как я прочитал принятый ответ, что для точного эквивалента ключевого слова readonly вам нужно объявить этот элемент следующим образом:

class Y
{
public:
     void mutate() { x = 7; } // not const member
     int x;
};

class X
{
private:
    Y * const member; // this only makes the pointer to Y const, 
                      // but you can still modify the object itself
public:
    X(Y *m) : member(m) {}

    void f() { member->mutate(); }
};

Надеюсь, что это поможет.

Ответ 4

Нет такой вещи напрямую. Вы можете использовать частное поле с открытым геттером (но без сеттера). Но это применимо только к другим классам, вызывающим ваш код. Foo всегда имеет полный доступ к своим членам. Но поскольку вы являетесь разработчиком Foo, это не проблема.

Ответ 5

Ссылка на С++ не может быть перегруппирована, поэтому она эквивалентна справочной системе С#.

Ответ 6

С++ имеет const, который выполняет ту же работу, что и readonly в С#.

const int Constant1 = 96;    
Constant1 = 200   // Compiler Error.

Ответ 7

У меня была такая же потребность, как и у вас, когда вы выполняли транскрипцию с С# на C++, и это просто синтаксическая ошибка, потому что эта инструкция существует в C++ (визуально C++)

Синтаксис: [только для чтения]

"Атрибут readonly C++ имеет ту же функциональность, что и атрибут" readonly "MIDL. Если вы хотите запретить изменение параметра метода, используйте атрибут in".

источник: https://msdn.microsoft.com/en-us/library/45x4ky7s.aspx

источник: https://msdn.microsoft.com/library/windows/desktop/aa367152

Ответ 8

У C++ есть ключевое слово const для участников класса. Ключевое слово const используется в других ситуациях, но в этом вопросе заключается в следующем.

Вы можете инициализировать константы класса с помощью конструктора только один раз. Если вам нужно добавить какую-то другую логику в ваш конструктор, но в файле .cpp, а не в .h, вы можете создать приватный метод и вызвать его в конструкторе.

Инициализация в конструкторе каждого константного члена в конструкторе разделяется запятыми.

file.h

    class Example 
    {
    private:
        const int constantMember1;
        const int constantMember2;
        const int constantMember3;
        void Init();
    public:
        Example(int a, int b) :constantMember1(a), constantMember2(b), constantMember3(a + b + 1) {
           //Initialization
           Init();
        };
    };

file.cpp

void Init()
{
//Some Logic intialization
}