状態をロックダウンするのは素晴らしいことです。 C#では、コンストラクターが完了した後、フィールドをreadonly
として宣言することで、フィールドの値/参照が変更されないようにすることができます。
class Foo
{
private readonly string _foo;
public Foo() {
_foo = "Unchangeable";
}
public void ChangeIt() {
_foo = "Darn"; // compiler error
}
}
C++でも同じことができますか?もしそうなら、どのように?そうでない場合は、なぜですか?
それは const になります。このキーワードは、さまざまなコンテキストでいくつかの異なることを意味することに注意してください。
class Foo
{
private:
const string _foo;
public:
Foo() : _foo("Unchangeable")
{
}
void ChangeIt()
{
_foo = "Darn"; // compiler error
}
};
直接そのようなことはありません。パブリックゲッターでプライベートフィールドを使用できます(ただし、セッターは使用できません)。しかし、それはあなたのコードを呼び出す他のクラスにのみ適用されます。 Foo
は常にそのメンバーに完全にアクセスできます。しかし、あなたはFoo
の実装者なので、これは実際の問題ではありません。
受け入れられた回答を読んだ後、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(); }
};
お役に立てれば。
C++の参照は再バインドできないため、C#の読み取り専用参照と同等です。
C++にはconst
があり、C#のreadonly
と同じ仕事をします。
const int Constant1 = 96;
Constant1 = 200 // Compiler Error.
C#からC++への文字起こしを行うときも同じ必要がありましたが、この命令はC++(ビジュアルC++)に存在するため、構文エラーにすぎません。
構文:[読み取り専用]
「読み取り専用のC++属性には、読み取り専用のMIDL属性と同じ機能があります。メソッドパラメータの変更を禁止する場合は、in属性を使用してください。」
ソース: https://msdn.Microsoft.com/en-us/library/45x4ky7s.aspx
ソース: https://msdn.Microsoft.com/library/windows/desktop/aa367152