锁定状态很棒。在C#中,一旦构造函数通过将其声明为readonly
完成,就可以确保字段不会更改它的值/引用。
class Foo
{
private readonly string _foo;
public Foo() {
_foo = "Unchangeable";
}
public void ChangeIt() {
_foo = "Darn"; // compiler error
}
}
我可以用C ++做同样的事情吗?如果是这样,怎么样?如果没有,为什么不呢?
答案 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