什么是C#的readonly字段修饰符的C ++等价物?

时间:2011-05-16 16:37:23

标签: c++ field immutability readonly

锁定状态很棒。在C#中,一旦构造函数通过将其声明为readonly完成,就可以确保字段不会更改它的值/引用。

class Foo
{
    private readonly string _foo;

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

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

我可以用C ++做同样的事情吗?如果是这样,怎么样?如果没有,为什么不呢?

7 个答案:

答案 0 :(得分:22)

那将是const。请注意,此关键字在不同的上下文中表示两种不同的内容。

答案 1 :(得分:11)

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

答案 2 :(得分:7)

在阅读了接受的答案之后,我并不是很清楚,为了使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(); }
};

希望这有帮助。

答案 3 :(得分:4)

没有直接的东西。您可以使用带有公共getter(但没有setter)的私有字段。但这只适用于调用代码的其他类。 Foo始终拥有对其成员的完全访问权限。但由于你是Foo的实施者,这不是真正的问题。

答案 4 :(得分:3)

C ++中的引用不可重新绑定,因此它等同于C#只读引用。

答案 5 :(得分:2)

C ++有const,与C#中的readonly完成相同的工作。

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

答案 6 :(得分:0)

在进行从C#到C ++的转录时,我有同样的需求 它只是一个语法错误,因为该指令存在于C ++(visual C ++)

语法:[readonly]

“readonly C ++属性与readonly MIDL属性具有相同的功能。 如果要禁止修改方法参数,请使用in属性。“

来源:https://msdn.microsoft.com/en-us/library/45x4ky7s.aspx

来源:https://msdn.microsoft.com/library/windows/desktop/aa367152