我怎么能用C++做到这一点?
//java example
public class MyImmutable {
private final int numToBeInitializedOnConstructionOrCompilationError;
public MyImmutable(int n) {
this.numToBeInitializedOnConstructionOrCompilationError = n;
}
}
Run Code Online (Sandbox Code Playgroud)
对于Java,如果最终属性在声明时未初始化,或者在构造函数上编译器将错误输出,则此代码有效,因为成员变量在构造函数中初始化.如何在C++中的类声明中强制实现不变性?
(仅定义公共getter方法不是一个可接受的答案,我知道'const'必须是解决方案的一部分)
如果我在C++中这样做:
class MyImmutable
{
private:
const int numToBeInitializedOnConstruction;
public:
MyImmutable(int n);
};
MyImmutable::MyImmutable(int n)
{
numToBeInitializedOnConstruction = n;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下错误,基本上告诉我我不能分配const成员,所以我猜const比java''final'更严格,是否有另一个关键字,或者有一种方法在声明后初始化const?
$ gcc const.cc
const.cc:10:10: error: constructor for 'MyClass' must explicitly initialize the const member
'numToBeInitializedOnConstruction'
MyClass::MyClass(int n) {
^
const.cc:3:13: note: declared here
const int numToBeInitializedOnConstruction;
^
const.cc:11:36: error: read-only variable is not assignable
numToBeInitializedOnConstruction = n;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)
那么如何在C++中声明java final成员变量的等价物呢?这可能吗?
E_n*_*ate 12
C++可以以比Java更好的方式处理对象不变性.首先,您可以使用const限定符从几乎任何类型中创建一个不可变对象.
const string str = "asd";
const MyClass myObj(1);
Run Code Online (Sandbox Code Playgroud)
你也可以拥有像numToBeInitializedOnConstruction你一样的常量属性,但它必须在构造函数的成员初始化列表中初始化,如下所示:
MyImmutable::MyImmutable(int n)
: numToBeInitializedOnConstruction(n) // like this
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
719 次 |
| 最近记录: |