Ответ 1
Это будет const. Обратите внимание, что это ключевое слово означает пару разных вещей в разных контекстах.
Состояние блокировки велико. В С# вы можете убедиться, что поле не изменит его значение/ссылку после завершения конструктора, объявив его как readonly
.
class Foo
{
private readonly string _foo;
public Foo() {
_foo = "Unchangeable";
}
public void ChangeIt() {
_foo = "Darn"; // compiler error
}
}
Могу ли я сделать то же самое с С++? Если да, то как? Если нет, почему бы и нет?
Это будет const. Обратите внимание, что это ключевое слово означает пару разных вещей в разных контекстах.
class Foo
{
private:
const string _foo;
public:
Foo() : _foo("Unchangeable")
{
}
void ChangeIt()
{
_foo = "Darn"; // compiler error
}
};
Мне не сразу стало ясно после того, как я прочитал принятый ответ, что для точного эквивалента ключевого слова 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(); }
};
Надеюсь, что это поможет.
Нет такой вещи напрямую. Вы можете использовать частное поле с открытым геттером (но без сеттера). Но это применимо только к другим классам, вызывающим ваш код. Foo
всегда имеет полный доступ к своим членам. Но поскольку вы являетесь разработчиком Foo
, это не проблема.
Ссылка на С++ не может быть перегруппирована, поэтому она эквивалентна справочной системе С#.
С++ имеет const
, который выполняет ту же работу, что и readonly
в С#.
const int Constant1 = 96;
Constant1 = 200 // Compiler Error.
У меня была такая же потребность, как и у вас, когда вы выполняли транскрипцию с С# на 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
У 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
}