web-dev-qa-db-ja.com

C#の読み取り専用フィールド修飾子に相当するC ++とは何ですか?

状態をロックダウンするのは素晴らしいことです。 C#では、コンストラクターが完了した後、フィールドをreadonlyとして宣言することで、フィールドの値/参照が変更されないようにすることができます。

class Foo
{
    private readonly string _foo;

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

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

C++でも同じことができますか?もしそうなら、どのように?そうでない場合は、なぜですか?

23
Drew Noakes

それは const になります。このキーワードは、さまざまなコンテキストでいくつかの異なることを意味することに注意してください。

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

直接そのようなことはありません。パブリックゲッターでプライベートフィールドを使用できます(ただし、セッターは使用できません)。しかし、それはあなたのコードを呼び出す他のクラスにのみ適用されます。 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(); }
};

お役に立てれば。

7
serine

C++の参照は再バインドできないため、C#の読み取り専用参照と同等です。

3
BCoates

C++にはconstがあり、C#のreadonlyと同じ仕事をします。

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

C#からC++への文字起こしを行うときも同じ必要がありましたが、この命令はC++(ビジュアルC++)に存在するため、構文エラーにすぎません。

構文:[読み取り専用]

「読み取り専用のC++属性には、読み取り専用のMIDL属性と同じ機能があります。メソッドパラメータの変更を禁止する場合は、in属性を使用してください。」

ソース: https://msdn.Microsoft.com/en-us/library/45x4ky7s.aspx

ソース: https://msdn.Microsoft.com/library/windows/desktop/aa367152

1
moons17